#include<stdio.h>
#define INF 1000000001
typedef struct {
int val, poz;
} elem;
int fiu_dr(int nod)
{
return 2*nod + 1;
}
int fiu_st(int nod)
{
return 2*nod;
}
int tata(int nod)
{
return nod/2;
}
void Schimb(int nod1, int nod2, elem v[], int p[])
{
elem aux = v[nod1]; v[nod1] = v[nod2]; v[nod2] = aux;
p[v[nod1].poz] = nod1;
p[v[nod2].poz] = nod2;
}
void HeapUp(int nod, elem v[], int p[])
{
while(nod > 1 && v[tata(nod)].val > v[nod].val) {
Schimb(tata(nod), nod, v, p);
nod = tata(nod);
}
}
void HeapDown(int nod, elem v[], int p[], int m)
{
while((fiu_dr(nod) < m && v[fiu_dr(nod)].val < v[nod].val) || (fiu_st(nod) < m && v[fiu_st(nod)].val < v[nod].val))
{
if(v[fiu_st(nod)].val < v[nod].val && v[fiu_st(nod)].val < v[fiu_dr(nod)].val) {
Schimb(fiu_st(nod), nod, v, p);
nod = fiu_st(nod);
} else {
Schimb(fiu_dr(nod), nod, v, p);
nod = fiu_dr(nod);
}
}
}
void Insert(FILE *in, int m, elem v[], int poz, int p[])
{
int x;
fscanf(in, "%d", &x);
v[m].val = x;
v[m].poz = poz;
p[poz] = m;
HeapUp(m, v, p);
}
void Delete(FILE *in, int m, elem v[], int p[])
{
int x;
fscanf(in, "%d", &x);
x = p[x];
Schimb(x, m, v, p);
v[m].val = INF;
HeapUp(x, v, p);
HeapDown(x, v, p, m);
}
void Min(FILE *out, elem v[])
{
fprintf(out, "%d\n", v[1].val);
}
void Afisare(FILE *out, int m, int poz, elem v[], int p[])
{
int i;
for (i=1; i<=m; i++)
fprintf (out, "%d %d\n", v[i].val, v[i].poz);
for (i=1; i<=poz; i++)
fprintf(out, "%d ", p[i]);
}
int main ()
{
FILE *in, *out;
in = fopen("heapuri.in", "r");
out = fopen("heapuri.out", "w");
int n, cod, m = 0, poz = 0;
fscanf(in, "%d", &n);
elem v[n+1];
int p[n+1];
while(n--) {
fscanf(in, "%d", &cod);
if(cod == 1) {
m ++;
poz ++;
Insert(in, m, v, poz, p);
}
else if(cod == 2) {
//int x; fscanf(in, "%d ", &x);
Delete(in, m, v, p);
m --;
}
else {
Min(out, v);
}
}
return 0;
}