You can do operation (1) in O(logN) and (2) in O(1) using two binary heaps (maybe you can do operation (3) fast too, I'm just not very fluent in probability theory).
Create a max-heap L and a min-heap R. Create two variables a and b that will store one (or two) middle elements. Heap L will store all elements lesser than middle one(s), heap R will store all elements greater than middle one(s). Size of L and R will always be the same.
Insert(x):
- If the count of elements in data structure is odd (astores middle element,bstores nothing):
- If the count of elements in data structure is even (aandbstore two middle elements):
- If x < a:
- Put bintoR
- Put xintoL
- b = null
 
- If x > b:
- Put xintoR
- Put aintoL
- a = b
- b = null
 
- If a <= x <= b:
- Put aintoL
- Put bintoR
- a = x
- b = null
 
 
GetMedian():
- Just return a(if count of elements is odd) or(a + b) / 2(of count of elements is even)