#include <iostream>
#include <fstream>
using namespace std;
#define MAXN 200010
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int h[MAXN], poz[MAXN], v[MAXN], n, op, N, x, k;
void schimba(int x, int y) {
swap(h[x], h[y]);
poz[h[x]] = x;
poz[h[y]] = y;
}
void sift(int poz) {
int nod = poz;
if (2 * poz <= N && v[h[2 * poz]] < v[h[nod]]) {
nod = 2 * poz;
}
if (2 * poz + 1 <= N && v[h[2 * poz + 1]] < v[h[nod]]) {
nod = 2 * poz + 1;
}
if (nod != poz) {
schimba(nod, poz);
sift(nod);
}
}
void perlocate(int poz) {
while (poz > 1 && v[h[poz]] < v[h[poz / 2]]) {
schimba(poz, poz / 2);
poz /= 2;
}
}
void del(int poz) {
schimba(poz, N--);
perlocate(poz);
sift(poz);
}
int main()
{
f >> n;
for (int i = 0; i < n; ++i) {
f >> op;
if (op == 3) {
g << v[h[1]] << '\n';
} else if (op == 2) {
f >> x;
del(poz[x]);
} else {
f >> v[++k];
h[++N] = k;
poz[k] = N;
perlocate(N);
}
}
return 0;
}