#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#define int long long
using namespace std;
template <class T>
class priority_queue {
private:
int t[1000005], siz;
inline int ls (int p) { return p << 1;}
inline int rs (int p) { return p << 1 | 1;}
inline int fa (int p) { return p >> 1;}
public:
priority_queue () {
siz = 0;
}
inline void push(T a) {
t[++ siz] = a;
int at = siz;
while (at != 1) {
if (t[fa(at)] > t[at]) {
swap(t[fa(at)], t[at]);
at = fa(at);
} else break;
}
return;
}
inline void pop() {
if (!siz) return;
t[1] = t[siz --];
int at = 1;
while (at <= siz) {
if (t[at] <= max(t[ls(at)], t[rs(at)])) break;
if (t[ls(at)] > t[rs(at)]) {
swap(t[ls(at)], t[at]);
at = ls(at);
} else {
swap(t[rs(at)], t[at]);
at = rs(at);
}
}
return;
}
inline int size() {
return siz;
}
inline T top() {
return t[1];
}
};
priority_queue <int> q;
signed main() {
int n;
scanf("%lld", &n);
while (n -- ) {
int op;
scanf("%lld", &op);
if (op == 1) {
int x;
scanf("%lld", &x);
q.push(x);
} else if (op == 2) {
printf("%lld\n", q.top());
} else {
q.pop();
}
}
return 0;
}