题意:
解法:
操作2用队列维护
操作3用堆维护
操作2删除时无法将操作3的定向删除,
因此再开一个del[]数组,标记一下已经被删除的数.
code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=2e6+5;
struct PI{
int first,second;
friend bool operator<(const PI& a,const PI& b){
if(a.first!=b.first)return a.first<b.first;
return a.second>b.second;
}
};
priority_queue<PI>q1;
queue<PI>q2;
int del[maxm];
signed main(){
ios::sync_with_stdio(0);
int q;cin>>q;
int i=0;
while(q--){
int op;cin>>op;
if(op==1){
i++;
int x;cin>>x;
q1.push({
x,i});
q2.push({
x,i});
}else if(op==2){
while(1){
PI x=q2.front();q2.pop();
if(del[x.second])continue;
del[x.second]=1;
cout<<x.second<<endl;
break;
}
}else{
while(1){
PI x=q1.top();q1.pop();
if(del[x.second])continue;
del[x.second]=1;
cout<<x.second<<endl;
break;
}
}
cout<<endl;
}
return 0;
}