#include <bits/stdc++.h>
using namespace std;
ifstream in ("heapuri.in");
ofstream out ("heapuri.out");
struct nod
{
int val, cron;
};
vector<nod> heap;
#define MAX_N 200000
int f[MAX_N];
int upHeap(int node)
{
while(node && heap[node] < heap[node/2])
{
swap(heap[node], heap[node/2]);
node = node/2;
}
return node;
}
void downHeap(int node)
{
}
int main()
{
int n, cod, x;
in >> n;
for(int i = 0; i < n; ++i)
{
in >> cod;
if(cod == 1)
{
in >> x;
heap.push_back({x, i + 1});
f[i+1] = upHeap(heap.size() - 1);
} else if(cod == 2)
{
in >> x;
int node = f[x];
swap(heap[node], heap[heap.size()-1]);
if(heap[node])
heap.pop();
} else if(cod == 3)
{
out << heap[0];
}
}
return 0;
}