#include <iostream>
#include <set>
#include <algorithm>
#include <stack>
#include <cstring>
using namespace std;
multiset<int> small, big;
stack<int> s;
int mid;
void adjust()
{
if (small.size() > big.size() + 1)
{
auto it = small.end();
--it;
big.insert(*it);
small.erase(it);
}
else if (small.size() < big.size())
{
auto it = big.begin();
small.insert(*it);
big.erase(it);
}
if (s.size() > 0)
{
auto it = small.end();
--it;
mid = *it;
}
}
int main()
{
int n;
char op[15];
int top, Key;
scanf("%d", &n);
while (n--)
{
scanf("%s", op);
if (op[1] == 'o')
{
if (s.size() == 0)
printf("Invalid\n");
else
{
top = s.top();
s.pop();
printf("%d\n", top);
if (mid >= top)
{
auto it = small.find(top);
small.erase(it);
}
else
{
auto it = big.find(top);
big.erase(it);
}
adjust();
}
}
else if (op[1] == 'u')
{
scanf("%d", &Key);
if (s.size() == 0)
{
small.insert(Key);
mid = Key;
}
else if (Key <= mid)
small.insert(Key);
else
big.insert(Key);
s.push(Key);
adjust();
}
else if (op[1] == 'e')
{
if (s.size() == 0)
printf("Invalid\n");
else
printf("%d\n", mid);
}
}
}
PAT (Advanced) 1057. Stack (30)
最新推荐文章于 2014-11-03 11:35:51 发布