#include <fstream>
const int MAX = 2e5;
int node, nh;
bool comp(int, int, int[]);
void swapX(int, int, int[], int[]);
void upHeap(int, int[], int[]);
void downHeap(int, int[], int[], int[]);
void addNode(int, int[], int[], int[]);
void delNode(int, int[], int[], int[]);
int main(){
std::ifstream f("heapuri.in");
std::ofstream g("heapuri.out");
int N;
f >> N;
int values[MAX + 5], heap[MAX + 5], pos[MAX + 5];
for(int i = 0; i < N; ++i){
int quest;
f >> quest;
switch(quest){
case 1:
++node;
f >> values[node];
addNode(node, heap, pos, values);
break;
case 2:
f >> quest;
delNode(pos[quest], heap, values, pos);
break;
case 3:
g << values[heap[1]] << "\n";
}
}
return 0;
}
bool comp(int x, int y, int values[]){
return values[x] < values[y];
}
void swapX(int child, int parent, int heap[], int pos[]){
std::swap(heap[child], heap[parent]);
std::swap(pos[heap[child]], pos[heap[parent]]);
}
void upHeap(int child, int heap[], int values[]){
int parent = child >> 1;
bool var = comp(heap[child], heap[parent], values);
if(parent and var){
swapX(child,parent, heap, values);
upHeap(parent, heap, values);
}
}
void downHeap(int parent, int heap[], int values[], int pos[]){
int child = parent << 1;
bool var = comp(heap[child + 1], heap[child], values);
bool var2 = child + 1 <= nh;
child = child + (var and var2);
bool var3 = comp(heap[child], heap[parent], values);
if(child <= nh and var3){
swapX(parent, child, heap, pos);
downHeap(child, heap, values, pos);
}
}
void addNode(int node, int heap[], int pos[], int values[]){
++nh;
heap[nh] = node;
pos[node] = nh;
upHeap(pos[node], heap, values); //here
}
void delNode(int node, int heap[], int values[], int pos[]){
swapX(node, nh, heap, pos);
pos[heap[nh]] = 0;
heap[nh] = 0;
nh--;
downHeap(node, heap, values, pos); //..and here
}