#include<iostream>
#define np nullptr
using namespace std;
struct node{
int x,s;
node *l,*r;
node(int val):x(val),s(1),l(np),r(np){}
public:
int getlsz(){
return (l ? l->s : 0);
}
int getrsz(){
return (r ? r->s : 0);
}
};
node* ins(node* r,int val){
if(r==np) return new node(val);
if(val<r->x){
r->l=ins(r->l,val);
}else if(val>r->x){
r->r=ins(r->r,val);
}
r->s=r->getlsz()+r->getrsz()+1;
return r;
}
int getrk(node* r,int val){
if(r==np) return 0;
if(val==r->x){
return r->getlsz()+1;
}else if(val>r->x){
return getrk(r->r,val)+r->getlsz()+1;
}else{
return getrk(r->l,val);
}
}
int getn(node* r,int rk){
if(r==np) return 0;
if(r->l){
if(r->l->s >= rk)return getn(r->l,rk);
if(r->l->s+1 == rk)return r->x;
}else{
if(rk==1)return r->x;
}
return getn(r->r, rk- r->getlsz() -1);
}
int getpre(node* r,int x){
int tmp=getrk(r,x);
if(tmp<=1)return -2147383647;
return getn(r,tmp-1);
}
int getnxt(node* r,int x){
int tmp=getrk(r,x);
if(tmp>=r->getlsz()+r->getrsz()+1)return 2147383647;
return getn(r,tmp+1);
}
int q,op,x;
node *r;
int main(){
cin>>q;
while(q--){
cin>>op>>x;
if(op==5){
r=ins(r,x);
}else if(op==1){
cout<<getrk(r,x)<<endl;
}else if(op==2){
cout<<getn(r,x)<<endl;
}else if(op==3){
cout<<getpre(r,x)<<endl;
}else if(op==4){
cout<<getnxt(r,x)<<endl;
}
}
return 0;
}