#include <iostream>
#include <fstream>
using namespace std;
int heap[200001],val[200001],pozitii[200001],s;
inline int tata(int n)
{
return n/2;
}
inline int fiustanga(int n)
{
return 2*n;
}
inline int fiudreapta(int n)
{
return 2*n+1;
}
void sus (int k)
{
while (tata(k)>=1&&val[heap[tata(k)]]>val[heap[k]])
{
swap(heap[tata(k)],heap[k]);
swap(pozitii[heap[k]],pozitii[heap[tata(k)]]);
k=tata(k);
}
}
void jos(int k)
{
bool merje=true;
int fiu;
while (merje)
{
merje=false;
if (fiudreapta(k)<=s&&val[heap[fiudreapta(k)]]<val[heap[k]])
{
merje=true;
if (val[heap[fiustanga(k)]]>val[heap[fiudreapta(k)]])
{
fiu=fiudreapta(k);
}
else
{
fiu=fiustanga(k);
}
}
else if (fiustanga(k)<=s&&val[heap[fiustanga(k)]]<val[heap[k]])
{
merje=true;
fiu=fiustanga(k);
}
if (merje)
{
swap(heap[k],heap[fiu]);
swap(pozitii[heap[k]],pozitii[heap[fiu]]);
k=fiu;
}
}
}
int main()
{
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int i,cod,n,x,tot=0,j;
in>>n;
for (i=1;i<=n;i++)
{
in>>cod;
if (cod==1)
{
s++;
tot++;
pozitii[tot]=s;
heap[s]=tot;
in>>val[tot];
sus(s);
}
if (cod==2)
{
in>>x;
x=pozitii[x];
swap(heap[x],heap[s]);
swap(pozitii[heap[x]],pozitii[heap[s]]);
s--;
sus(x);
jos(x);
}
if (cod==3)
{
out<<val[heap[1]]<<"\n";
}
}
}