#include <cstdio>
#define MAXN 200000
int H[MAXN+1],poz[MAXN+1],nr[MAXN+1];
inline int lson(int x){
return 2*x;
}
inline int rson(int x){
return 2*x+1;
}
inline int tnod(int x){
return x/2;
}
inline void swap(int x,int y,int *v){
int aux=v[x];
v[x]=v[y];
v[y]=aux;
}
inline void urcare(int x){
while(tnod(x)>0&&H[tnod(x)]>H[x]){
swap(x,tnod(x),H);
swap(nr[x],nr[tnod(x)],poz);
swap(x,tnod(x),nr);
x=tnod(x);
}
}
inline void coborare(int x,int m){
int flag=1;
while(lson(x)<=m&&flag){
flag=0;
if(H[lson(x)]<H[x]&&(rson(x)>m||H[lson(x)]<H[rson(x)])){
flag=1;
swap(x,lson(x),H);
swap(nr[x],nr[lson(x)],poz);
swap(x,lson(x),nr);
x=lson(x);
}
else
if(rson(x)<=m&&H[x]>H[rson(x)]){
flag=1;
swap(x,rson(x),H);
swap(nr[x],nr[rson(x)],poz);
swap(x,rson(x),nr);
x=rson(x);
}
}
}
int main(){
FILE*fi,*fout;
int i,n,t,m,x,con;
fi=fopen("heapuri.in" ,"r");
fout=fopen("heapuri.out" ,"w");
fscanf(fi,"%d" ,&n);
m=con=0;
for(i=1;i<=n;i++){
fscanf(fi,"%d" ,&t);
if(t==1){
fscanf(fi,"%d" ,&x);
m++;
con++;
H[m]=x;
nr[m]=con;
poz[con]=m;
urcare(m);
}
if(t==2){
fscanf(fi,"%d" ,&x);
H[poz[x]]=H[m];
poz[nr[m]]=poz[x];
nr[poz[x]]=nr[m];
m--;
coborare(poz[x],m);
}
if(t==3)
fprintf(fout,"%d\n" ,H[1]);
}
fclose(fi);
fclose(fout);
return 0;
}