#include <cstdio>
#include <algorithm>
using namespace std;
#define DIM 200010
typedef int Heap [DIM];
int n, a[DIM], poz[DIM], N;
Heap H;
inline int father(int nod){
return nod/2;
}
inline int left_son(int nod){
return nod * 2;
}
inline int right_son(int nod){
return nod * 2 + 1;
}
void sift(Heap H, int n, int k)
{
int son;
do
{
son = 0;
if (left_son(k) <= n)
{
son = left_son(k);
if (right_son(k) <= n && H[right_son(k)] < H[left_son(k)])
son = right_son(k);
if (H[son] >= H[k])
son = 0;
}
if (son)
{
swap(H[k], H[son]);
swap(poz[k], poz[son]);
k = son;
}
} while (son);
}
void percolate(Heap H, int n, int k)
{
int key = H[k];
while (k > 1 && key < H[father(k)])
{
H[k] = H[father(k)], k = father(k);
swap(poz[k], poz[father(k)]);
}
H[k] = key;
}
void build_heap(Heap H, int n)
{
for (int i= n / 2; i; --i)
sift(H, n, i);
}
void cut(Heap H, int &n, int k)
{
H[k] = H[n];
--n;
if (k > 1 && H[k] < H[father(k)])
percolate(H, n, k);
else
sift(H, n, k);
}
void afisare(Heap H, int n)
{
int i;
for (i = 1; i <= n; ++i)
printf ("%d ", H[i]);
printf("\n");
for (i = 1; i <= n; ++i)
printf ("%d ", a[i]);
printf("\n");
for (i = 1; i <= n; ++i)
printf ("%d ", poz[i]);
printf("\n||-----------||\n");
}
void insert(Heap H, int &n, int key)
{
H[n] = key;
percolate(H, n, n);
}
int main()
{
FILE *f = fopen("heapuri.in", "r"), *f2 = fopen("heapuri.out", "w");
fscanf(f, "%d", &N);
for (int i = 1, tip = 0, x; i <= N; ++i)
{
fscanf(f, "%d", &tip);
if (tip == 1)
{
printf ("tip = %d\n", tip);
fscanf(f, "%d", &x);
a[++n] = x;
poz[n] = n;
insert(H, n, x);
// afisare(H, n);
}
else
if (tip == 2)
{
printf ("tip = %d\n", tip);
fscanf(f, "%d", &x);
cut(H, n, poz[x]);
// afisare(H, n);
}
else
fprintf(f2, "%d\n", H[1]);
}
fclose(f);
fclose(f2);
return 0;
}