#include <fstream>
#include <vector>
#include <climits>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
const int N = 200001;
int n, v[N], nh, h[N], poz[N];
vector <int> a[N];
inline void myswap(int p, int q) {
int t1 = h[p], t2 = h[q];
//poz[ h[p] ] = q;
//poz[ h[q] ] = p;
swap(h[p], h[q]);
swap(poz[t1], poz[t2]);
//poz[ h[p] ] = p;
//poz[ h[q] ] = q;
}
void urca(int p) {
while (p > 1 && v[ h[p] ] < v[ h[p >> 1] ]) {
myswap(p, p >> 1);
p >>= 1;
}
}
void coboara(int p) {
int f1 = p << 1, f2 = p << 1 + 1, best = p;
if (f1 <= nh && v[ h[best] ] > v[ h[f1] ]) best = f1;
if (f2 <= nh && v[ h[best] ] > v[ h[f2] ]) best = f2;
if (best != p) {
myswap(best, p);
coboara(best);
}
}
void adauga(int val) {
h[++nh] = val;
poz[n] = nh;
urca(nh);
}
void sterge(int p) {
myswap(p, nh--);
urca(p);
coboara(p);
}
int main()
{
int op, len, x;
in >> len;
for (int i = 0; i < len; i++) {
in >> op;
if (op == 1) {
in >> x;
v[++n] = x;
adauga(n);
}
if (op == 2) {
in >> x;
sterge(poz[x]);
}
if (op == 3) out << v[ h[1] ] << '\n';
}
in.close();
out.close();
}