思路
经典题,比较简单
因为要求中位数,所以拿两个优先队列去维护,一个大顶堆,一个小顶堆
大顶堆维护比较小的那一半,堆顶就是中间数了。
小顶堆维护比较大的那一半,堆顶自然就是中间数。

如果序列是奇数个的时候,不妨把多的一个放在大顶堆内,那么答案就是大顶堆的 堆顶了
当两个堆都不为空时候,边插入,边比较堆顶大小即可。

#include<bits/stdc++.h>
using namespace std;
int main(){
    ios::sync_with_stdio(0);
    int _;cin>>_;
    while(_--){
        int cas,n;cin>>cas>>n;
        int num=0;
        cout<<cas<<" "<<(n+1)/2<<endl;
        priority_queue<int> q1;//大顶堆
        priority_queue<int,vector<int>,greater<int>>q2;///小顶堆
        for(int i=1;i<=n;i++){
            int x;cin>>x;
            if(i&1) q1.push(x);
            else q2.push(x);
            if(i>=2){//保证两个堆都不为空
                if(q1.top()>q2.top()){
                    int a=q1.top(),b=q2.top();
                    q1.pop();q2.pop();
                    q1.push(b),q2.push(a);
                }
            }
            if(num==10) cout<<endl,num=0;
            if(i&1) cout<<q1.top()<<" ",num++;
        }
        cout<<endl;
    }
    return 0;
}