#include <iostream>
#include <cstring>
using namespace std;
int n,h[1000010];
int o,Len=0;
void down(int len){
if(len*2+1<=Len&&h[len*2]!=0x7f&&h[len*2+1]!=0x7f&&h[len]>h[len*2]||h[len]>h[len*2+1]){
if(h[len*2]>h[len*2+1]){
swap(h[len],h[len*2+1]);
down(len*2+1);
}
else{
swap(h[len],h[len*2]);
down(len*2);
}
}
}
void up(int len){
while(len/2>0&&h[len/2]!=0x7f&&h[len]<h[len/2]){
swap(h[len],h[len/2]);
len/=2;
}
}
void del(int len){
swap(h[1],h[len]);
Len--;
down(1);
}
int main(){
cin>>n;
memset(h,0x7f,sizeof(h));
for(int i=1;i<=n;i++){
cin>>o;
if(o==1){
Len++;
int x;
cin>>x;
h[Len]=x;
up(Len);
}
else if(o==2){
cout<<h[1]<<endl;
}
else{
del(Len);
}
}
return 0;
}