#include<bits/stdc++.h>
using namespace std;
struct tree{
int p=0,lchild=0,rchild=0;
}heap[1000005];
int len=0;
bool check(int x){
if(x%2==0) return heap[x/2].p<heap[x].p;
else return heap[(x-1)/2].p<heap[x].p;
}
void insert(int x){
len++;
heap[len].p=x;
if(len!=1){
if(len%2==0) heap[len/2].lchild=len;
else heap[(len-1)/2].rchild=len;
int q=len;
while(1){
if(check(q)) break;
if(q%2==0) swap(heap[q].p,heap[q/2].p),q=q/2;
else swap(heap[q].p,heap[(q-1)/2].p),q=(q-1)/2;
}
}
return;
}
void detele(){
int q=1;
while(heap[q].lchild||heap[q].rchild){
if(heap[q].lchild&&heap[q].rchild){
if(heap[heap[q].lchild].p>=heap[heap[q].rchild].p){
swap(heap[q].p,heap[heap[q].rchild].p);
q=heap[q].rchild;
}
else{
swap(heap[q].p,heap[heap[q].lchild].p);
q=heap[q].lchild;
}
}else if(heap[q].lchild){
swap(heap[q].p,heap[heap[q].lchild].p);
q=heap[q].lchild;
}else{
swap(heap[q].p,heap[heap[q].rchild].p);
q=heap[q].rchild;
}
}
heap[len].p=0;
if(len%2==0) heap[len/2].lchild=0;
else heap[(len-1)/2].rchild=0;
len--;
return;
}
int main(){
int n;
cin >> n;
for(int i=1;i<=n;i++){
int opt;
cin >> opt;
if(opt==1){
int x;
cin >> x;
insert(x);
}else if(opt==2){
cout << heap[1].p << endl;
}else{
detele();
}
}
return 0;
}