rt
#include<cstdio>
#include<algorithm>
#define int long long
#define N 1919810
#define inf 2147483647
#define void inline void
using namespace std;
struct Treap{
int lc,rc,val,priority,count,size;
#define lc(x) s[x].lc
#define rc(x) s[x].rc
#define v(x) s[x].val
#define p(x) s[x].priority
#define c(x) s[x].count
#define s(x) s[x].size
}s[N];
int n,m,pool;
void update(int &p){
s(p)=s(lc(p))+s(rc(p))+c(p);
}
void zig(int &p){
int y=lc(p);
lc(p)=rc(y);rc(y)=p;
s(y)=s(p);update(p);
p=y;
}
void zag(int &p){
int y=rc(p);
rc(p)=lc(y);lc(y)=p;
s(y)=s(p);update(p);
p=y;
}
void insert(int &p,int val){
if(!p){
v(p)=val;p(p)=rand();//随机数据保证Treap相对平衡
c(p)=s(p)=1;lc(p)=rc(p)=0;
}else s(p)++;
if(v(p)==val)c(p)++;
else if(val<v(p)){
insert(lc(p),val);
if(p(lc(p))<p(p))zig(p);
}else{
insert(rc(p),val);
if(p(rc(p))<p(p))zag(p);
}
}
//void del(int &p,int val){
// if(v(p)==val){
// if(c(p)>1)c(p)--,s(p)--;
// else if(!lc(p)||!rc(p))p=lc(p)+rc(p);
// else if(p(lc(p))<p(rc(p)))zig(p),del(p,val);
// else zag(p),del(p,val);
// }
// s(p)--;
// if(val<v(p))del(lc(p),val);
// else del(rc(p),val);
//}
inline int prev(int val){
int x=pool,res=-inf;
while(x){
if(v(x)<=val)res=v(x),x=rc(x);
else x=lc(x);
}
return res;
}
inline int next(int val){
int x=pool,res=inf;
while(x){
if(v(x)>=val)res=v(x),x=lc(x);
else x=rc(x);
}
return res;
}
inline int rank(int val){
int x=pool,res=0;
while(x){
if(val==v(x))return res+s(lc(x))+1;
if(val<v(x))x=lc(x);
else res+=s(lc(x))+c(x),x=rc(x);
}
return res;
}
inline int kth(int &p){
int x=pool;
while(x){
if(s(lc(x))<p&&s(lc(x))+c(x)>=p)return v(x);
if(s(lc(x))>=p)x=lc(x);
else p-=s(lc(x))+c(x),x=rc(x);
}
return 0;
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
int op,x;
scanf("%lld%lld",&op,&x);
if(op==1)printf("%lld\n",rank(x));
if(op==2)printf("%lld\n",kth(x));
if(op==3)printf("%lld\n",prev(x));
if(op==4)printf("%lld\n",next(x));
if(op==5)insert(++pool,x);
}
return 0;
}