#include <stdio.h>
#define MAXN 200000
#define PARENT(X) X / 2
#define CHILD(X) X * 2
int v[MAXN], vn, ad[MAXN], nr = 0;
static inline void swap(int x, int y) {
int aux = v[x];
v[x] = v[y];
v[y] = aux;
aux = ad[x];
ad[x] = ad[y];
ad[y] = aux;
}
void climbHeap(int x) {
while (v[x] > v[PARENT(x)])
swap(x, PARENT(x));
}
void downHeap(int x) {
int c1 = v[CHILD(x)];
int c2 = v[CHILD(x) + 1];
if (c1 != 0) {
if (c1 < v[x] && (c1 < c2 || c2 == 0)) {
swap(x, c1);
downHeap(c1);
} else if (c2 != 0 && c2 < v[x] && c2 < c1) {
swap(x, c2);
downHeap(c2);
}
}
}
void addElement(int x) {
v[vn] = x;
ad[nr] = vn + 1;
nr++;
climbHeap(x);
vn++;
}
void deleteElement(int x) {
swap(x, vn - 1);
vn--;
downHeap(x);
}
int main() {
int n, i, j, t, x;
FILE *fin, *fout;
fin = fopen("heapuri.in", "r");
fout = fopen("heapuri.out", "w");
fscanf(fin, "%d", &n);
for (i = 0; i < n; i++) {
fscanf(fin, "%d", &t);
if (t == 1) { // Adaugam x
fscanf(fin, "%d", &x);
addElement(x);
} else if (t == 2) {
fscanf(fin, "%d", &x);
j = 0;
while (ad[j] != x)
j++;
deleteElement(j);
} else {
fprintf(fout, "%d\n", v[0]);
}
}
fclose(fin);
fclose(fout);
return 0;
}