#include<bits/stdc++.h>
#define maxn 10010
using namespace std;
long long n,len,num,a[maxn],ans,x,opt; //小根堆
void put(long long x){ //插入一个x
a[++len]=x;
long long son=len,father;
while(son>1){
father=son/2;
if(a[father]<=a[son])break;
else swap(a[father],a[son]);
son=father;
}
}
long long get(){ //删除根节点
long long res=a[1];
a[1]=a[len];
len--;
long long son=1,father=1;
while(father*2<=len){
son*=2;
if(son<len&&a[son+1]<a[son])son++;
if(a[father]<=a[son])break;
else swap(a[father],a[son]);
father=son;
}
return res;
}
int main() {
cin>>n;
for(int i=1;i<=n;i++){
cin>>opt;
if(opt==1){
cin>>x;
put(x);
}
else if(opt==2){
cout<<a[1]<<endl;
}
else get();
}
return 0;
}
/*
*/