https://cn.vjudge.net/contest/158362#problem/A
对前一半后一半分别维护一个set,操作时做相应调整即可
#include<stdio.h>
#include<set>
#include<queue>
using namespace std;
int n,type,aim,q;
queue<int> Q;
set<int> S1,S2;
set<int>::iterator it;
inline void mt()
{
if (n && S1.size()!=(n>>1))
{
if ((n>>1)<S1.size())
{
it=S1.end();
it--;
S2.insert(*it);
S1.erase(it);
}
else
{
S1.insert(*S2.begin());
S2.erase(S2.begin());
}
}
}
int main()
{
scanf("%d",&q);
for (;q--;)
{
scanf("%d",&type);
if (type==1)
{
scanf("%d",&aim);
Q.push(aim);
n++;
if (aim<*S2.begin()) S1.insert(aim);
else S2.insert(aim);
mt();
}
if (type==2)
{
aim=Q.front();Q.pop();n--;
if (aim<*S2.begin()) S1.erase(aim);
else S2.erase(aim);
mt();
}
if (type==3) printf("%d\n",*S2.begin());
}
}