题目链接:点击打开链接
题目大意:略。
解题思路:multiset 技巧分为两个set,一个从小到大,一个从大到小,来控制平衡求第几大K数。

AC 代码
using namespace std;
typedef long long ll;
stack<int> sk;
multiset<int> stmax; // 0->1
multiset<int,greater<int>> stmin; // 1->0
int mid;
void keep()
{
    int len1=stmin.size(), len2=stmax.size();
    if(len1<len2) // 1 2
    {
        stmin.insert(*stmax.begin());
        stmax.erase(stmax.begin());
    }
    else if(len1-len2>=2) // 2 2,5 3
    {
        stmax.insert(*stmin.begin());
        stmin.erase(stmin.begin());
    }
    mid=*stmin.begin();
}
int main()
{
    int n,val,id;
    char op[15];
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%s",op);
        if(op[1]=='u')
        {
            scanf("%d",&val);
            sk.push(val);
            if(val<=mid) stmin.insert(val);
            else stmax.insert(val);
            keep();
        }
        else if(op[1]=='o')
        {
            if(sk.size()==0) puts("Invalid");
            else
            {
                int tp=sk.top(); sk.pop();
                printf("%d\n",tp);
                if(tp>*stmin.begin()) stmax.erase(stmax.find(tp));
                else stmin.erase(stmin.find(tp));
                if(sk.size()!=0) keep();
            }
        }
        else if(op[1]=='e')
        {
            if(sk.size()==0) puts("Invalid");
            else printf("%d\n",mid);
        }
    }
    return 0;
}









