#include<bits/stdc++.h>
#define M7 (int)(1e6+3)
using namespace std;
int n,x;
struct PQueue{
int value[M7];
int size=0;
void up(int x){
while(x>1&&value[x]<value[x>>1]){
int temp;
temp=value[x];
value[x]=value[x>>1];
value[x>>1]=temp;
x>>=1;
}
}
void push(int x){
value[++size]=x;
up(size);
}
void pop(){
value[1]=value[size];
--size;
int x=1;
while((x<<1)<size){
if(x<<1==size||value[x<<1]<value[x<<1|1]){
int temp;
temp=value[x];
value[x]=value[x<<1];
value[x<<1]=temp;
x<<=1;
}
else{
int temp;
temp=value[x];
value[x]=value[x<<1|1];
value[x<<1|1]=temp;
x<<=1;
++x;
}
}
}
int top(){return value[1];}
bool empty(){return !size;}
}Q;
int main(){
scanf("%d",&n);
while(n--){
scanf("%d",&x);
if(x==1){
scanf("%d",&x);
Q.push(x);
}
else if(x==2){printf("%d\n",Q.top());}
else if(x==3) Q.pop();
}
return 0;
}