获取一个序列的最大值或最小值时可以想到用优先队列或有序集合;如果同时求最小与最大,则想到用集合解决。本题采用多重集合,利用多重集合有序性解决。

#include <iostream>
#include <set>
using namespace std;
int main(){
    int n,op,x;
    cin>>n;
    multiset<int> s;              //初始化多重集合
    for(int i=0;i<n;i++){
        cin>>op;
        switch(op){
            case 1:
                cin>>x;
                s.insert(x);break;
            case 2:cout<<*s.begin()<<endl;break;
            case 3:cout<<*s.rbegin()<<endl;break;      //s.rbegin()是反向迭代器,指向集合的最后一个元素
            case 4:s.erase(s.begin());break;
            case 5:s.erase(--s.end());break;        //erase不可直接用于反向迭代器,所以使用--s.end()代替
        }
    }
    return 0;
}