首先,题目的要求是能查找最大值,删除最小值,插入值
那么我们可以用优先队列或者multiset按从小到大排序,删除的时候只要把第一个元素删除,
最大值的话优先队列比较麻烦一点,需要不停地维护其最大值,而multiset只需要返回它end()的前面一位就行了,(前提非空)
下面见两种写法
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
/*优先队列
void solve(int n){
priority_queue<int,vector<int>,greater<int> >Q;
int a,b;
int minv=-INF;
for(int i=1;i<=n;i++){
scanf("%d",&a);
if(a==1){
scanf("%d",&b);
Q.push(b);
minv=max(minv,b);
}
if(a==2){
if(!Q.empty()){
int tmp=Q.top();
Q.pop();
if(tmp==minv)
minv=-INF;
}
}
if(a==3){
if(!Q.empty())
printf("%d\n",minv);
else
printf("0\n");
}
}
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
solve(n);
}
return 0;
}
*/
/*multiset
void solve(int n){
multiset<int> fifth;
int a,b;
for(int i=1;i<=n;i++){
scanf("%d",&a);
if(a==1){
scanf("%d",&b);
fifth.insert(b);
}
if(a==2){
if(!fifth.empty()){
fifth.erase(fifth.begin());
}
}
if(a==3){
if(!fifth.empty()){
printf("%d\n",*(--fifth.end()));
}
else
printf("0\n");
}
}
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
solve(n);
}
return 0;
}
*/