#include<iostream>
using namespace std;
struct node {
int cnt=0;
int element[100101];
void up(int x) {
if(x==1) return ;
if(element[x]>element[x/2]) return ;
swap(element[x],element[x/2]);
up(x/2);
}
void down(int x) {
if(x>cnt) return ;
int s=x*2;
if(element[s]>element[s+1]&&s+1<cnt) s++;
if(s>cnt||element[x]<element[s]) return ;
swap(element[x],element[s]);
down(s);
}
void pop() {
element[1]=element[cnt--];
down(1);
}
void push(int sum) {
element[++cnt]=sum;
up(cnt);
}
int top() {
return element[1];
}
bool empty() {
return (cnt==0);
}
int siz() {
return cnt;
}
} heap;
int n,a,ans;
int main() {
cin>>n;
for(int i=1;i<=n;i++){
cin>>ans;
if(ans==1) {
cin>>a;
heap.push(a);
}
if(ans==2)
cout<<heap.top()<<endl;
if(ans==3)
heap.pop();
}
return 0;
}