#include <fstream>
#include <algorithm>
#define Nmax 200099
#define Father(i) i/2
#define LeftSon(i) 2*i
#define RightSon(i) 2*i+1
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int Noduri,N,H[Nmax],v[Nmax],w[Nmax],nr;
//nr va reprezenta cate chei au fost introduse
//cand o cheie dispare e nu se modifica!
//v[i]= nodul care a intrat al i-lea in ordine cronologica
//w[nod]= pe ce pozitie cronologica a intrat nodul nod
inline void Swap(int x,int y)
{
swap(w[x],w[y]);
v[w[x]]=x;
v[w[y]]=y;
swap(H[x],H[y]);
}
void DownHeap(int nod)
{
int Son=0;
do
{
Son=0;
// Alege un fiu mai mare ca tatal.
if (LeftSon(nod)<=N)
{
Son=LeftSon(nod);
if( RightSon(nod)<=N && H[RightSon(nod)]<H[LeftSon(nod)] ) Son=RightSon(nod);
if (H[Son]>=H[nod]) Son=0;
}
if (Son)
{
Swap(nod,Son);
nod=Son;
}
} while(Son);
}
inline void UpHeap(int nod)
{
int key=H[nod];
while (nod>1 && key<H[Father(nod)])
{
Swap(nod,Father(nod));
nod=Father(nod);
}
H[nod]=key;
}
inline void DeleteHeap(int x)
{
int nod=v[x];
Swap(v[x],N);
--N;
UpHeap(nod);
DownHeap(nod);
}
inline void InsertHeap(int key)
{
H[++N]=key;
v[++nr]=N;
w[N]=nr;
UpHeap(N);
}
int main()
{
f>>Noduri;
for(int i=1;i<=Noduri;++i)
{
int tip;
f>>tip;
if(tip==1)
{
int key;
f>>key;
InsertHeap(key);
}
else
if(tip==2)
{
int x;
f>>x;
DeleteHeap(x);
}
else g<<H[1]<<'\n'; // min/max din Heap
}
f.close();g.close();
return 0;
}