对顶堆
用一个最大堆和一个最小堆,如果当前元素比最小堆堆顶的值大就插入最小堆,反之插入最大堆。维护最大堆和最小堆的元素差不超过一,如果超过,哪个堆的元素多就把这个堆的堆顶元素给另外一个堆

#include <iostream>
#include <queue>
using namespace std;
int t, num1, num2, x;
int read() {
    char ch;
    int sum, sign = 1;
    while ((ch = getchar()) > '9' || ch < '0')
        if (ch == '-')
            sign = -1;
    sum = ch - '0';
    while ((ch = getchar()) >= '0' && ch <= '9')
        sum = (sum << 3) + (sum << 1) + ch - '0';
    return sum * sign;
}
int main()
{
       t=read();
    while (t--) {
        num1=read();
        num2=read();
        cout << num1 << " " << (num2 + 1) / 2 << endl;
        priority_queue<int,vector<int> ,greater<int> >q1;
        priority_queue<int, vector<int>, less<int> >q2;
        x=read();
        cout << x << " ";
        q1.push(x);
        for (int i = 2; i <= num2; i++) {
            x=read();
            if (q1.top() >= x) {
                q2.push(x);
            }
            else {
                q1.push(x);
            }
            if (q1.size() > 1+q2.size()) {//注意不能写为q1.size()-q2.size()>1 这样写vector会越界(不知道原因emm
                q2.push(q1.top());
                q1.pop();
            }
            else if (q2.size()  > 1+q1.size()) {//这个也要注意
                q1.push(q2.top());
                q2.pop();
            }
            if (i % 2 == 1) {
                if (q1.size() > q2.size())cout << q1.top() << " ";
                else cout << q2.top() << " ";
            }
            if (i % 20 == 0) {
                cout << endl;
            }
        }
        cout << endl;
    }
}