#include <iostream>
#include <fstream>
using namespace std;
#define MAX 200010
void move_up(int heap[], int ordine[], int pozitie[], int nod) {
int aux;
while (nod > 1 && ordine[heap[nod]] < ordine[heap[nod / 2]]) {
aux = heap[nod];
heap[nod] = heap[nod / 2];
heap[nod / 2] = aux;
aux = pozitie[heap[nod]];
pozitie[heap[nod]] = pozitie[heap[nod / 2]];
pozitie[heap[nod / 2]] = aux;
nod /= 2;
}
}
void move_down(int heap[], int n, int ordine[], int pozitie[], int nod) {
int minim, aux;
while (nod * 2 <= n) {
if (nod * 2 == n || ordine[heap[nod * 2]] < ordine[heap[nod * 2 + 1]]) {
minim = nod * 2;
} else {
minim = nod * 2 + 1;
}
if (ordine[heap[minim]] < ordine[heap[nod]]) {
aux = heap[nod];
heap[nod] = heap[minim];
heap[minim] = aux;
aux = pozitie[heap[nod]];
pozitie[heap[nod]] = pozitie[heap[minim]];
pozitie[heap[minim]] = aux;
nod = minim;
} else {
break;
}
}
}
void add(int heap[], int &n, int ordine[], int pozitie[], int &nr, int val) {
ordine[++nr] = val;
heap[++n] = nr;
pozitie[nr] = n;
move_up(heap, ordine, pozitie, n);
}
void del(int heap[], int &n, int ordine[], int pozitie[], int &nr, int poz) {
heap[pozitie[poz]] = heap[n--];
pozitie[heap[pozitie[poz]]] = pozitie[poz];
if (pozitie[poz] == 1 || heap[pozitie[poz] / 2] < heap[pozitie[poz]]) {
move_down(heap, n, ordine, pozitie, pozitie[poz]);
} else {
move_up(heap, ordine, pozitie, pozitie[poz]);
}
}
int main()
{
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n, op, x, heap[MAX], n_heap = 0, ordine[MAX], pozitie[MAX], nr = 0;
fin >> n;
for (int i = 0; i < n; i++) {
fin >> op;
if (op == 3) {
fout << ordine[heap[1]] << endl;
} else {
fin >> x;
if (op == 1) {
add(heap, n_heap, ordine, pozitie, nr, x);
} else {
del(heap, n_heap, ordine, pozitie, nr, x);
}
}
}
fin.close();
fout.close();
return 0;
}