#include <queue>
class Solution {
public:
    #define SCD static_cast<double>
    priority_queue<int> maxtop;     //maxtop
    priority_queue<int, vector<int>, greater<int> > mintop;  //小根堆

    void Insert(int num) {
        maxtop.push(num);

        mintop.push( maxtop.top() );
        maxtop.pop();
        
        if(maxtop.size() < mintop.size() && !mintop.empty() ){
            maxtop.push( mintop.top() );
            mintop.pop();
        }
    }

    double GetMedian() { 
        int maxtop_sz = maxtop.size();
        int mintop_sz = mintop.size();

        if( mintop_sz == maxtop_sz ){
            return SCD( maxtop.top()+mintop.top() ) /2;
        }else{
            return SCD( maxtop.top() );
        }
    }

};