#include <iostream>
using namespace std;
int len=0;
int ordine[200005];
struct Node{
int data;
struct Node *r,*l;
};
struct Node* NodNou(int valoare){
struct Node* nod= (struct Node*) malloc(sizeof(struct Node));
nod->l=NULL; nod->r=NULL;
nod->data=valoare;
return nod;
} ;
struct Node* Adauga(struct Node* rad,int val){
struct Node *nod=NodNou(val);
struct Node *ch,*rem;
ch=rad; rem=NULL;
while (ch!=NULL){
rem=ch;
if (val<ch->data) ch=ch->l; else if (val>ch->data) ch=ch->r; else if (val==ch->data) return NULL;
}
if (rem==NULL) return nod;
else if(val<rem->data) rem->l=nod;
else if( val>rem->data) rem->r=nod;
return NULL;
};
int MaxLeftSubtree(struct Node* rad){
struct Node *rem,*rs; int val;
rem=rad; rs=rad;
rad=rad->l;
while (rad->r!=NULL){
rem=rad;
rad=rad->r;
}
if(rs==rem) {rs->l=rad->l; val=rad->data; free(rad); return val;}
else {rem->r=NULL; val=rad->data; free(rad); return val;}
}
int MinRightSubtree(struct Node* rad){
struct Node *rem,*rs; int val;
rem=rad; rs=rad;
rad=rad->r;
while (rad->l!=NULL){
rem=rad;
rad=rad->l;
}
if(rs==rem) {rs->r=rad->r; val=rad->data; free(rad); return val;}
else {rem->l=NULL; val=rad->data; free(rad); return val;}
}
void Sterge(struct Node* rad, int val){
if (rad==NULL) return;
struct Node* rem;
while (rad!=NULL && rad->data!=val ){
rem=rad;
if(val<rad->data) rad=rad->l;
if(val>rad->data) rad=rad->r;
}
if (rad==NULL) return;
if (rad->l==NULL && rad->r==NULL) {if(rem->l==rad) rem->l=NULL; else rem->r=NULL; free(rad); return; }
if(rad->l!=NULL) {rad->data=MaxLeftSubtree(rad); return; }
if (rad->l==NULL) {rad->data=MinRightSubtree(rad); return;}
}
int k;
void InOrder(struct Node* rad,int elem,int *arr,int narr){
if (rad != NULL) {InOrder(rad->l,elem,arr,narr); k++; if(k==elem) {arr[narr]=rad->data; return;} InOrder(rad->r,elem,arr,narr);}
}
void PostOrder(struct Node* rad,int elem,int *arr,int narr){
if (rad != NULL) {PostOrder(rad->l,elem,arr,narr); PostOrder(rad->r,elem,arr,narr); k++; if(k==elem) {arr[narr]=rad->data; return;} }
}
void PreOrder(struct Node* rad,int elem,int *arr,int narr){
if (rad != NULL) {k++; if(k==elem) {arr[narr]=rad->data; return;} PreOrder(rad->l,elem,arr,narr); PreOrder(rad->r,elem,arr,narr); }
}
int mintree(struct Node* rad)
{
if(rad == NULL) return -45;
if(rad->l == NULL)
return rad->data;
return mintree(rad->l);
}
int main(){
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int n,i,x,m,a,b;
struct Node* rad=NULL;
int arr[1500],narr=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>x;
if(x==1)
{
cin>>a;
if(rad==NULL)
rad = Adauga(rad, a);
else
Adauga(rad, a);
ordine[++len] = a;
}
else
if(x==2)
{
cin>>a;
Sterge(rad, ordine[a]);
}
else
{
b = mintree(rad);
cout<<b<<"\n";
}
}
return 0;
}