#include <queue>
class Solution {
private:
    priority_queue<int, vector<int>, less<>> max_heap; // 最大堆
    priority_queue<int, vector<int>, greater<>> min_heap; // 最小堆
public:
    void Insert(int num) {
        if (max_heap.empty() || num <= max_heap.top()) {
            max_heap.push(num);
        } else {
            min_heap.push(num);
        }

        // 保持两个堆的大小平衡
        if (max_heap.size() > min_heap.size() + 1) {
            min_heap.push(max_heap.top());
            max_heap.pop();
        } else if (min_heap.size() > max_heap.size()) {
            max_heap.push(min_heap.top());
            min_heap.pop();
        }
    }

    double GetMedian() { 
        if (max_heap.size() == min_heap.size()) {
            return (max_heap.top() + min_heap.top()) / 2.0;
        } else {
            return max_heap.top();
        }
    }
};