Record
#include<bits/stdc++.h>
#define int long long
#define ls t[p].l
#define rs t[p].r
using namespace std;
const int N=1e5+25;
const int inf=0x7fffffff;
inline int read(){
int x=0,f=1;
char c=getchar_unlocked();
while(!isdigit(c)){
if(c=='-')f*=-1;
c=getchar_unlocked();
}
while(isdigit(c)){
x=(x<<3)+(x<<1)+(c^48);
c=getchar_unlocked();
}
return x*f;
}
struct treap{
int l,r;
int val,dat;
int siz,cnt;
}t[N];
int tot,root;
inline void update(int p){
t[p].siz=t[ls].siz+t[rs].siz+t[p].cnt;
}
inline void zig(int &p){
int q=t[p].l;
t[p].l=t[q].r,t[q].r=p,p=q;
update(rs),update(p);
}
inline void zag(int &p){
int q=t[p].r;
t[p].r=t[q].l,t[q].l=p,p=q;
update(ls),update(p);
}
inline int New(int val){
t[++tot].val=val;
t[tot].dat=rand();
t[tot].cnt=1,t[tot].siz=1;
return tot;
}
inline void build(){
New(-inf),New(inf);
root=1,t[root].r=2;
update(root);
}
inline int GetRankByVal(int p,int val){
if(!p)return 0;
if(val==t[p].val)return t[ls].siz+1;
if(val<t[p].val)return GetRankByVal(ls,val);
return (GetRankByVal(rs,val)+t[ls].siz+t[p].cnt);
}
inline int GetValByRank(int p,int rnk){
if(!p)return inf;
if(t[ls].siz>=rnk)return GetValByRank(ls,rnk);
if(t[ls].siz+t[p].cnt>=rnk)return t[p].val;
return GetValByRank(t[p].r,rnk-t[ls].siz-t[p].cnt);
}
inline void Insert(int &p,int val){
if(!p){
p=New(val);
return;
}
if(val==t[p].val){
t[p].cnt++,update(p);
return;
}
if(val<t[p].val){
Insert(ls,val);
if(t[p].dat<t[ls].dat)zig(p);
}
else{
Insert(rs,val);
if(t[p].dat<t[rs].dat)zag(p);
}
update(p);
}
int GetPre(int val){
int ans=1;
int p=root;
while(p){
if(val==t[p].val){
if(t[p].l>0){
p=t[p].l;
while(t[p].r>0)p=t[p].r;
ans=p;
}
break;
}
if(t[p].val<val&&t[p].val>t[ans].val)ans=p;
p=val<t[p].val?t[p].l:t[p].r;
}
return t[ans].val;
}
inline int GetNext(int val){
int ans=2;
int p=root;
while(p){
if(val==t[p].val){
if(t[p].r>0){
p=t[p].r;
while(t[p].l>0)p=t[p].l;
ans=p;
}
break;
}
if(t[p].val>val&&t[p].val<t[ans].val)ans=p;
p=val<t[p].val?t[p].l:t[p].r;
}
return t[ans].val;
}
inline void Remove(int &p,int val){
if(!p)return;
if(val==t[p].val){
if(t[p].cnt>=2){
t[p].cnt--,update(p);
return;
}
if(t[p].l||t[p].r){
if(!t[p].r||t[ls].dat>t[rs].dat)
zig(p),Remove(rs,val);
else zag(p),Remove(ls,val);
update(p);
}
else p=0;
return ;
}
val<t[p].val?Remove(ls,val):Remove(rs,val);
update(p);
}
int n;
signed main(){
srand(time(0));
build();
cin>>n;
int opt,x;
for(int i=1;i<=n;i++){
opt=read(),x=read();
switch (opt){
case 1:{
Insert(root,x);
break;
}
case 2:{
Remove(root,x);
break;
}
case 3:{
cout<<GetRankByVal(root,x)-1<<endl;
break;
}
case 4:{
cout<<GetValByRank(root,x+1)<<endl;
break;
}
case 5:{
cout<<GetPre(x)<<endl;
break;
}
case 6:{
cout<<GetNext(x)<<endl;
break;
}
}
}
}