#include<stdio.h>
#include<stdlib.h>
void swap(int *a,int *b){
int t;
t = *a;
*a = *b;
*b = t;
}
void urca(int p,int *h,int *poz,int *ap){
int t = p / 2;
while(t >= 1){
if(ap[h[t]] <= ap[h[p]])
break;
swap(&h[t],&h[p]);
poz[h[t]] = t;
poz[h[p]] = p;
p = t;
t = p / 2;
}
}
void coboara(int p,int n,int *h,int *poz,int *ap){
int fs = 2 * p,fd = 2 * p + 1,pmin = p;
if(fs <= n && ap[h[fs]] < ap[h[pmin]])
pmin = fs;
if(fd <= n && ap[h[fd]] < ap[h[pmin]])
pmin = fd;
if(pmin != p){
swap(&h[p],&h[pmin]);
poz[h[p]] = p;
poz[h[pmin]] = pmin;
coboara(pmin,n,h,poz,ap);
}
}
int main(){
FILE *f,*g;
f = fopen("heapuri.in","r");
g = fopen("heapuri.out","w");
int n,i,p,l = 0,x,j = 0;
fscanf(f,"%d",&n);
int *h = (int*)malloc((n + 1) * sizeof(int));
int *poz = (int*)malloc((n + 1) * sizeof(int));
int *ap = (int*)malloc((n + 1) * sizeof(int));
//int *v = (int*)malloc((n + 1) * sizeof(int));
for(i = 1;i <= n;i++){
fscanf(f,"%d",&p);
if(p == 1){
fscanf(f,"%d",&x);
ap[++j] = x;
h[++l] = j;
poz[j] = l;
urca(l,h,poz,ap);
}
else if(p == 2){
fscanf(f,"%d",&x);
poz[h[l]] = poz[x];
swap(&h[poz[x]],&h[l]);
l--;
coboara(poz[x],l,h,poz,ap);
}
else
fprintf(g,"%d\n",ap[h[1]]);
}
/*
for(i = 1;i <= j;i++)
printf("%d ",ap[i]);
printf("\n");
*/
free(h);
free(poz);
free(ap);
fclose(f);
fclose(g);
return 0;
}