#include<stdio.h>
#define nr_elem 200001
using namespace std;
int v[nr_elem],poz_heap; // v[i] reprezinta pozitia al i-lea element in heap
void swap(int &a,int &b,int i1,int i2)
{
int aux;
aux=a;
a=b;
b=aux;
aux=v[i1];
v[i1]=v[i2];
v[i2]=aux;
}
void min_heapify_down(int heap[nr_elem],int n,int i)
{
int l,r,min,aux;
l=2*i;
r=2*i+1;
min=i;
if(l<=n&&heap[l]<heap[min])
min=l;
if(r<=n&&heap[r]<heap[min])
min=r;
if(min!=i)
{
swap(heap[i],heap[min],i,min);
poz_heap=min;
min_heapify_down(heap,n,min);
}
}
void min_heapify_up(int heap[nr_elem],int n,int i)
{
int p;
p=i/2;
if(p>=1&&heap[p]>heap[i])
{
swap(heap[i],heap[p],i,p);
min_heapify_up(heap,n,p);
}
}
void insert_node(int heap[nr_elem],int &n,int nr)
{
n++;
heap[n]=nr;poz_heap=n;
min_heapify_up(heap,n,nr);
}
void delete_node(int heap[nr_elem],int &n,int poz)
{
swap(heap[poz],heap[n],poz,n);
n--;
poz_heap=poz;
if(poz/2>=1&&heap[poz]<heap[poz/2])
min_heapify_up(heap,n,poz);
else
if((2*poz<=n&&heap[poz]>heap[2*poz])||(2*poz+1<=n&&heap[poz]>heap[2*poz+1]))
min_heapify_down(heap,n,poz);
}
int elementul_minim(int heap[nr_elem],int n)
{
return heap[1];
}
int main()
{
int n,i,a,b,nr=0,r[nr_elem],h[nr_elem],nr_r=0; // in r se pastreaza elementele in ordinea citirii lor
FILE *c,*d; // h reprezinta vectorul care respecta structura de heap
c=fopen("heapuri.in","r");
d=fopen("heapuri.out","w");
fscanf(c,"%d",&n);
for(i=1;i<=n;i++)
{
fscanf(c,"%d",&a);
if(a==1)
{
fscanf(c,"%d",&b);
nr_r++;
r[nr_r]=b;
insert_node(h,nr,b);
v[nr]=poz_heap;
}
else
if(a==2)
{
fscanf(c,"%d",&b);
delete_node(h,nr,v[b]);
v[b]=v[nr+1];
}
else
fprintf(d,"%d\n",elementul_minim(h,nr));
}
fclose(c);
fclose(d);
}