看大部分题解都是使用最小堆优先队列,不过我是直接以题入手,题问什么我答什么,既然提到多重集合,那么不妨就使用这个数据结构来解题:

#include <iostream>
#include <set>
using namespace std;

int main() {
    multiset<long long>a;
    int n;
    cin >> n;
    while (n--) {
        int op;
        cin >> op;
        switch (op) {
            case 1:{
                long long x;
                cin >> x;
                a.insert(x);
                break;
            }
            case 2:{
                cout << *(a.begin()) << '\n';
                break;
            }
            case 3:{
                auto it = a.begin();
                a.erase(it);
                break;
            }
        }
    }
}
// 64 位输出请用 printf("%lld")