#include<iostream>
using namespace std;
namespace Heap {
template <size_t Maxlen, class T = int>
struct heap {
T var[Maxlen];
int len = 0;
T top() {
return var[1];
}
bool empty() {
return !len;
}
void push(T &x) {
var[++len] = x;
for(int k = len; k > 1 && var[k] < var[k >> 1]; k >>= 1) {
swap(var[k], var[k >> 1]);
}
}
void pop() {
if(empty()) {
return;
}
int k = 1;
for(int x; (k << 1) <= len; k = x) {
x = (var[k << 1] < var[k << 1 | 1] ? k << 1 : k << 1 | 1);
x = (x > len ? k << 1 : x);
swap(var[k], var[x]);
}
swap(var[k], var[len--]);
}
};
};
using namespace Heap;
const int MaxN = 1e6 + 3;
heap<MaxN>h;
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;
cin >> n;
while(n--) {
int op, x;
cin >> op;
if(op == 1) {
cin >> x;
h.push(x);
} else if(op == 2) {
cout << h.top() << '\n';
} else {
h.pop();
}
}
return 0;
}