#include <iostream>
#include<climits>
#include <fstream>
using namespace std;
ifstream be("heapuri.in");
ofstream ki("heapuri.out");
struct elem{
int ertek;
int sorszam;
};
int hs=0;
elem h[200002];
int helye[200002];
int parent(int i)
{
return ((i-1)/2);
}
int left(int i)
{
return (2*i+1);
}
int right(int i)
{
return (2*i+2);
}
void swap1(int i,int j)
{
elem temp=h[i];
h[i]=h[j];
h[j]=temp;
helye[h[i].sorszam]=i;
helye[h[j].sorszam]=j;
}
void heap_add(int k,int db)
{
hs++;
int i=hs-1;
h[i].ertek=k;
h[i].sorszam=db;
helye[db]=i;
while(i!=0 && h[i].ertek<h[parent(i)].ertek)
{
swap1(i,parent(i));
i=parent(i);
}
}
void Heap_if(int i)
{
int l=left(i);
int r=right(i);
int smallest=i;
if(l<hs && h[l].ertek<h[i].ertek)
smallest=l;
if(r<hs && h[r].ertek<h[smallest].ertek)
smallest=r;
if(smallest!=i){
swap1(i,smallest);
Heap_if(smallest);
}
}
void heap_elem_csere(int ertek,int i)
{
h[i].ertek=ertek;
h[i].sorszam=0;
helye[0]=i;
if(i!=0 && h[i].ertek<h[parent(i)].ertek)
{
swap1(i,parent(i));
i=parent(i);
}
}
int min_kiszedes()
{
if (hs<0)
return INT_MAX;
if(hs==1)
{
hs--;
return h[0].ertek;
}
int root=h[0].ertek;
swap1(0,hs-1);
hs--;
Heap_if(0);
return root;
}
void heap_delete(int i)
{
h[helye[i]].ertek=INT_MAX;
Heap_if(helye[i]);
/*heap_elem_csere(INT_MIN,helye[i]);
min_kiszedes();*/
}
int main()
{
int n,k,c,db=0;
be>>n;
for(int i=0;i<n;i++)
{
be>>k;
/* switch(k){
case 1:
heap_add(h,c);
break;
case 2:
heap_delete(h,c-1);
break;
case 3:
cout<<h[0]<<endl;
break;
}
cout<<h[i]<<endl;*/
if(k==1)
{
db++;
be>>c;
heap_add(c,db);
}
else if(k==2){
be>>c;
heap_delete(c);
}
else if(k==3)
{
ki<<h[0].ertek<<'\n';
}
}
return 0;
}