#include<bits/stdc++.h>
#define MAXN 100005
#define INF 0x3f3f3f3f
using namespace std;
int n,endnode,rt,outputk;
default_random_engine rnd;
struct node{
int val,cnt;
int ls,rs;
int siz,lev;
void clear(){
val=cnt=ls=rs=siz=0;
lev=rnd();
}
}treap[MAXN];
vector<int>rubbish;
int new_node(){
int nnode=0;
if(rubbish.empty()){
nnode=++endnode;
}else{
nnode=rubbish.back();
rubbish.pop_back();
}
treap[nnode].clear();
return nnode;
}
void delete_node(int &p){
rubbish.push_back(p);
treap[p].clear();
p=0;
}
void push_up(int p){
treap[p].siz=treap[treap[p].ls].siz+treap[treap[p].rs].siz+treap[p].cnt;
}
void split(int p,int v,int &x,int &y){
if(p==0){
x=y=0;
push_up(p);
return;
}
if(treap[p].val<=v){
x=p;
split(treap[p].rs,v,treap[p].rs,y);
}else{
y=p;
split(treap[p].ls,v,x,treap[p].ls);
}
push_up(p);
}
int merge(int x,int y){
if(x==0||y==0){
push_up(x+y);
return x+y;
}
if(treap[x].lev<treap[y].lev){
treap[x].rs=merge(treap[x].rs,y);
push_up(x);
return x;
}else{
treap[y].ls=merge(x,treap[y].ls);
push_up(y);
return y;
}
}
void insert(int v){
int x,y,z;
split(rt,v,x,z);
split(x,v-1,x,y);
if(y==0){
y=new_node();
treap[y].val=v;
}
treap[y].cnt++;
push_up(y);
rt=merge(merge(x,y),z);
}
void erase(int v){
int x,y,z;
split(rt,v,x,z);
split(x,v-1,x,y);
if(treap[y].cnt<=1) delete_node(y);
rt=merge(merge(x,y),z);
}
int treap_rank(int v){
int x,y;
split(rt,v-1,x,y);
int tmp=treap[x].siz+1;
rt=merge(x,y);
return tmp;
}
int kth(int p,int x){
if(treap[treap[p].ls].siz>=x){
return kth(treap[p].ls,x);
}else if(treap[treap[p].ls].siz+treap[p].cnt>=x){
return treap[p].val;
}else{
return kth(treap[p].rs,x-treap[treap[p].ls].siz-treap[p].cnt);
}
}
int count(int v){
int x,y,z;
split(rt,v,x,z);
split(x,v-1,x,y);
int tmp=treap[y].siz;
rt=merge(merge(x,y),z);
return tmp;
}
int back(int v){
int x,y;
split(rt,v,x,y);
int tmp=treap[x].siz;
rt=merge(x,y);
return kth(rt,tmp+1);
}
int main(){
rnd.seed(114514);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
int opt,x;
for(int i=1;i<=n;i++){
cin>>opt>>x;
if(opt==1){
insert(x);
}else if(opt==2){
erase(x);
}else if(opt==3){
cout<<treap_rank(x)<<'\n';
}else if(opt==4){
cout<<kth(rt,x)<<'\n';
}else if(opt==5){
cout<<kth(rt,treap_rank(x)-1)<<'\n';
}else if(opt==6){
cout<<back(x)<<'\n';
}
}
return 0;
}
提交记录