#include <cstdio>
using namespace std;
FILE *in,*out;
const int NMAX = 200005;
int heap[NMAX],f[NMAX],v[NMAX];
int sizeheap;
void swap(int p1,int p2)
{
int tmp = heap[p1];
heap[p1] = heap[p2];
heap[p2] = tmp;
tmp = f[heap[p1]];
f[heap[p1]] = f[heap[p2]];
f[heap[p2]] = tmp;
}
void urca(int p)
{
if(p == 1)
return;
if(v[heap[p]]< v[heap[p/2]])
{
swap(p,p/2);
urca(p/2);
}
}
void coboara(int p)
{
int dest = p;
if(sizeheap >= p*2 && v[heap[p]] > v[heap[p*2]])
{
dest = p*2;
}
if(sizeheap >= p*2+1 && v[heap[dest]] > v[heap[p*2+1]])
dest = p*2+1;
if(dest != p){
swap(dest,p);
coboara(dest);
}
}
void add(int nr,int indice)
{
sizeheap ++;
v[indice] = nr;
heap[sizeheap] = indice;
f[indice] = sizeheap;
urca(sizeheap);
}
void sterge(int poz)
{
int indice = f[poz];
swap(sizeheap,indice);
heap[sizeheap] = 0;
sizeheap --;
urca(indice);
coboara(indice);
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int n,indice = 0;
scanf("%d",&n);
for(int i = 1;i <= n;i ++)
{
int t;
scanf("%d",&t);
if(t != 3)
{
int nr;
scanf("%d",&nr);
if(t == 1)
add(nr,++indice);
if(t == 2)
sterge(nr);
}
else
printf("%d\n",v[heap[1]]);
}
return 0;
}