#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1e5+5,N=1e7+5;
class stree {
private:
int t[maxn*24],l[maxn*24],r[maxn*24];
int cnt;
inline int lc(int root){
return l[root]?l[root]:l[root]=cnt++;
}
inline int rc(int root){
return r[root]?r[root]:r[root]=cnt++;
}
inline int getm(int l,int r){
return l+((r-l)>>1);
}
void add(int root,int l,int r,int x,int k){
t[root]+=k;
if(l==r)return;
//cout<<"!!!";
int mid=getm(l,r);
if(x<=mid)add(lc(root),l,mid,x,k);
else add(rc(root),mid+1,r,x,k);
return;
}
int query_sum(int root,int l,int r,int x,int y){
if(x<=l&&r<=y){
return t[root];
}
int mid=getm(l,r),ans=0;
if(x<=mid)ans+=query_sum(lc(root),l,mid,x,y);
if(mid+1<=y)ans+=query_sum(rc(root),mid+1,r,x,y);
return ans;
}
int query_order(int root,int l,int r,int k){
//查询第k小的数
if(l==r)return l;
int mid=getm(l,r);
if(t[lc(root)]<k)return query_order(rc(root),mid+1,r,k-t[lc(root)]);
return query_order(lc(root),l,mid,k);
}
public:
inline void add(int x,int k){
add(1,1,N,x,k);
return;
}
inline int query_sum(int x,int y){
return query_sum(1,1,N,x,y);
}
inline int query_order(int k){
return query_order(1,1,N,k);
}
stree(){
cnt=2;
}
}tr;
int n;
int main() {
scanf("%d",&n);
int opt,x;
for(int i=1;i<=n;i++){
scanf("%d%d",&opt,&x);
switch (opt)
{
case 1:
tr.add(x,1);
break;
case 2:
tr.add(x,-1);
break;
case 3:
printf("%d\n",tr.query_sum(1,x));
break;
case 4:
printf("%d\n",tr.query_order(x));
break;
case 5:
printf("%d\n",tr.query_order(tr.query_sum(1,x-1)));
break;
case 6:
printf("%d\n",tr.query_order(tr.query_sum(1,x)+1));
break;
default:
break;
}
}
return 0;
}
rt #6~#11MLE