#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int heap[200005], timeline[200005], poz[200005], u=0, hc=0;
int n;
void tests(){
int i;
for(i=1;i<=hc;i++)
cout<<heap[i]<<" ";
cout<<endl;
for(i=1;i<=hc;i++)
cout<<timeline[i]<<" ";
cout<<endl;
cout<<endl;
}
void upHeap(int x, int y){
if(x*y==0) return;
if(heap[x]<heap[y]){
swap(heap[x], heap[y]);
swap(timeline[x], timeline[y]);
poz[timeline[x]]=x;
poz[timeline[y]]=y;
upHeap(y, y/2);
}
}
void downHeap(int x){
int son=x*2;
if(son+1<=hc and heap[son+1]<heap[son])
son++;
if(son<=hc){
if(heap[son]<heap[x]){
swap(heap[son], heap[x]);
swap(timeline[son], timeline[x]);
poz[timeline[son]]=son;
poz[timeline[x]]=x;
downHeap(son);
}
}
}
void add(int value){
hc++;
u++;
timeline[hc]=u;
poz[u]=hc;
heap[hc]=value;
upHeap(hc, hc/2);
}
void del(int value){
int nod, i;
nod=poz[value];
swap(heap[nod], heap[hc]);
swap(timeline[nod], timeline[hc]);
poz[timeline[nod]]=nod;
poz[timeline[hc]]=hc;
hc--;
downHeap(nod);
}
int main()
{
int i, task, value;
fin>>n;
for(i=1;i<=n;i++){
fin>>task;
if(task==1){
fin>>value;
add(value);
}
else if(task==2){
fin>>value;
del(value);
}
else
fout<<heap[1]<<"\n";
}
return 0;
}