双队列
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
系统A用来维护客户。每个客户的id用一个正整数K来表示,当客户进入系统时用P来表示此用户的优先度。这个系统有以下请求
0
系统停止运行
1 K P
优先度为P的客户K进入系统
2
找到优先度最高的客户,然后此客户离开系统
3
找到优先度最低的客户,然后此客户离开系统
输入
- 每行包括一个请求,最后一行包括一个停止请求(代码0)。对于添加客户请求(代码1),优先度都是唯一的。客户的表示K小于10 6,优先度P小于10 7,一个客户可能会被添加多次,每次的优先度可能不同。 输出
- 对于每个请求2和3,程序必须输出一行。这行包括此请求中找到客户的id。如果系统中没有客户,输出0 样例输入
-
21 20 141 30 321 10 993220
样例输出
-
02030100
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
using namespace std;
struct Client
{
int id,prio;
Client(int i,int p):id(i),prio(p){}
bool operator < (const Client&a) const
{
return prio<a.prio;
}
};
set<Client>S;
set<Client>::iterator it;
int main()
{
int n,x,y;
while(cin>>n&&n)
{
if(n==1)
{
cin>>x>>y;
S.insert(Client(x,y));
continue;
}
if(S.empty())
{
cout<<0<<endl;
continue;
}
if(n==2)
{
it=S.end();
it--;
cout<<(*it).id<<endl;
S.erase(*it);
}
else if(n==3)
{
it=S.begin();
cout<<(*it).id<<endl;
S.erase(*it);
}
}
return 0;
}