#include <fstream>
#define DIM 400010
using namespace std;
ifstream fin ("heapuri.in" );
ofstream fout("heapuri.out");
int N, M, i, j, k, val, cod;
int Heap[DIM], Frec[DIM];
int aux, d;
int cond_1(){return cod == 1;}
int cond_2(){return cod == 2;}
int cond_3(){return cod == 3;}
void Find(){
i = 1;
while(Frec[i] != val)
i ++;
return;
}
void Percolate(int val){
while((val > 1) && (Heap[val] < Heap[val/2])){
aux = Heap[val]; Heap[val] = Heap[val/2]; Heap[val/2] = aux;
aux = Frec[val]; Frec[val] = Frec[val/2]; Frec[val/2] = aux;
val /= 2;
}
return;
}
void Shift(int val){
if(Heap[val*2] == 0)
return;
if(Heap[val*2+1] == 0 && Heap[val*2] != 0)
if(Heap[val] > Heap[val*2]){
aux = Heap[val]; Heap[val] = Heap[val*2]; Heap[val*2] = aux;
aux = Frec[val]; Frec[val] = Frec[val*2]; Frec[val*2] = aux;
return;
}
if(Heap[val*2+1] != 0){
if(Heap[val*2] < Heap[val*2+1] && Heap[val] > Heap[val*2+1]){
aux = Heap[val]; Heap[val] = Heap[val*2+1]; Heap[val*2+1] = aux;
aux = Frec[val]; Frec[val] = Frec[val*2+1]; Frec[val*2+1] = aux;
val = val * 2 + 1;
Shift(val);
return;
}
if(Heap[val*2] > Heap[val*2+1] && Heap[val] > Heap[val*2+0]){
aux = Heap[val]; Heap[val] = Heap[val*2+0]; Heap[val*2+0] = aux;
aux = Frec[val]; Frec[val] = Frec[val*2+0]; Frec[val*2+0] = aux;
val = val * 2 + 0;
Shift(val);
return;
}
}
return;
}
void Build_Heap(){
fin >> N;
for(k = 1; k <= N; k ++){
fin >> cod;
if(cond_1()){
fin >> val; d ++;
Heap[d] = val;
Frec[d] = d;
Percolate(d);
}
if(cond_2()){
fin >> val;Find();
Heap[i] = Heap[d]; Heap[d] = 0;
Frec[i] = Frec[d]; Frec[d] = 0;
d --;
Percolate(i);
Shift(i);
}
if(cond_3()){
fout << Heap[1];
fout << "\n";
}
}
return;
}
int main(){
Build_Heap();
return 0;
}