#include <fstream>
#define NMAX 200001
using namespace std;
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");
int n,nr;
int poz[NMAX];
//poz[i]=pozitia in h a elementului intrat al i-lea in ordinea cronologica
struct heap
{
int inf;
int ord;
}h[NMAX];
void inserare(int in)
{
int f,t;
f=++n;
t=f/2;
while(t>0 && h[t].inf>in)
{
poz[h[t].ord]=f;
h[f]=h[t];
f=t;
t=t/2;
}
h[f].inf=in;
h[f].ord=n;
poz[h[f].ord]=f;
}
void combinare(int i)
{
int in=h[i].inf,t=i,f=2*i;
while (f<=n)
{
if (f+1<=n && h[f].inf>h[f+1].inf)
f++;
if (h[f].inf<in)
{
h[t]=h[f];
t=f;
f=2*t;
poz[t]=poz[f];
}
else break;
}
h[t].inf=in;
}
void extragere(int i)
{
heap x=h[poz[i]];
h[poz[i]]=h[n--];
combinare(poz[i]);
}
int main()
{
int k,x;
fin>>nr;
for (int i=0;i<nr;i++)
{
fin>>k;
if (k<3)
fin>>x;
if (k==1)
inserare(x);
else if (k==2)
extragere(x);
else fout<<h[1].inf<<'\n';
}
return 0;
}