#include<stdio.h>
struct pereche
{
int poz,val;
};
pereche heap[200002],v[200002];
int n,a,c,x,nrelem,i,vmin;
inline void adaug(int c,int x,int &i)
{
nrelem++;
// urcarea
i=nrelem;
while(i/2>0 && heap[i/2].val>x)
{
heap[i]=heap[i/2];
v[heap[i].poz].poz=i;
i=i/2;
}
heap[i].poz=c;
heap[i].val=x;
}
inline void sterg(int x)
{
int p,pmin,vmin;
pereche aux;
p=v[x].poz;
heap[p]=heap[nrelem];
v[heap[p].poz].poz=p;
nrelem--;
while(p*2<=nrelem)
{
vmin=heap[p*2].val;
pmin=2*p;
if(2*p+1<=nrelem && heap[2*p+1].val<vmin)
{
vmin=heap[2*p+1].val;
pmin=2*p+1;
}
if(vmin<heap[p].val)
{
aux=heap[p];
heap[p]=heap[pmin];
v[heap[p].poz].poz=p;
heap[pmin]=aux;
v[heap[pmin].poz].poz=pmin;
p=pmin;
}
else
{
break;
}
}
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
c=0;
nrelem=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a);
if(a==1)
{
scanf("%d",&x);
c++;
v[c].val=x;
adaug(c,x,v[c].poz);
}
if(a==2)
{
scanf("%d",&x);
sterg(x);
}
if(a==3)
{
printf("%d\n",heap[1].val);
}
}
return 0;
}
/*
#include<stdio.h>
int v[200002], pv[200002];
int H[200002], pH, pH1, q, nH;
int n,a,c,x,i;
void adaug(int poz)
{
int i,p,x;
x=v[poz];
nH++;
// urcarea
i=nH;
p=(i>>1);
pH=H[p];
while(p && v[pH]>x)
{
H[i]=pH;
pv[pH]=i;
i=p;
p=(i>>1);
pH=H[p];
}
H[i]=poz;
pv[poz]=i;
}
void sterg(int poz)
{
int p,i;
v[poz]=-1;
q=H[nH];
nH--;
p=pv[poz];
while((p<<1)<=nH)
{
i=(p<<1);
pH=H[i];
pH1=H[i+1];
if(i+1<=nH && v[pH1]<v[pH])
{
pH=pH1;
i++;
}
if(v[pH]<v[q])
{
H[p]=pH;
pv[pH]=p;
p=i;
}
else break;
}
H[p]=q;
pv[q]=p;
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
c=0;
nH=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a);
if(a==1)
{
scanf("%d",&x);
c++;
v[c]=x;
adaug(c);
}else
if(a==2)
{
scanf("%d",&x);
sterg(x);
}else
{
printf("%d\n",v[H[1]]);
}
}
fclose(stdout);
fclose(stdin);
return 0;
}
*/