class Solution {
public:
void Insert(int num)
{
int n = min.size(); //最小堆的元素
int m = max.size(); //最大堆的元素

    if (((n + m) &1) == 0)  //若为偶数,即n == m //则将元素插入最大堆
    {
        if (n > 0 && num > min[0]) //原本是要插入到最大堆的,可是这个数比最小堆堆堆顶大,则需要调换
        {
            int temp = min[0];  //最小堆堆顶元素
            pop_heap(min.begin(), min.end()); // pop最小堆最顶元素
            min.pop_back();

            min.push_back(num);  //push num到最小堆
            make_heap(min.begin(), min.end(), greater<int>());

            max.push_back(temp);
            make_heap(max.begin(), max.end());
        }
        else {
            max.push_back(num);
            make_heap(max.begin(), max.end());
        }
    }
    else {  //若为奇数,插入元素到最小堆。此时一定有 m > 0
        if (num < max[0])  //若有num小于最大堆堆顶,则需要把最大堆堆顶 放入最小堆
        {
            int temp = max[0];

            pop_heap(max.begin(), max.end()); //将最大堆堆顶换至到末尾
            max.pop_back();

            max.push_back(num);
            make_heap(max.begin(), max.end());

            min.push_back(temp);
            make_heap(min.begin(), min.end(), greater<int>());
    }
        else { //直接插入最小堆堆顶
            min.push_back(num);
            make_heap(min.begin(), min.end(), greater<int>());
        }
}

}

double GetMedian()
{
    double res;
    int m = max.size(); //最大堆堆顶元素
    int n = min.size();

    if (m == n && m == 0)
        return 0.0;

    if (n == m)
        res = (double)((max[0] + min[0]) / 2.0);
    if (n != m)
        res = (double)max[0];

    return res;
}

private:
vector<int> min;
vector<int> max;
};</int></int>