#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
std::mt19937 rnd(233);
const int N=1e5+5;
struct fhq
{
int l,r;
int key,val;
int siz;
}tr[(int)1e5+5];
int rt,idx;
int x,y,z;
int add(int key){
tr[++idx].key=key;
tr[idx].val=rnd();
tr[idx].siz=1;
return idx;
}
void push_up(int x){
tr[x].siz=tr[tr[x].l].siz+tr[tr[x].r].siz+1;
}
void split(int p,int key,int &x,int &y){
if(!p)x=y=0;
else{
if(tr[x].key<=key){
x=p;//将p的左子树全部放在x
split(tr[p].r,key,tr[p].r,y);
}else{
y=p;
split(tr[p].l,key,x,tr[p].l);
}
}
}
int merge(int x,int y){
if(!x||!y)return x+y;
if(tr[x].val>=tr[y].val){
tr[x].r=merge(tr[x].r,y);
push_up(x);
return x;
}else{
tr[y].l=merge(x,tr[y].l);
push_up(y);
return y;
}
}
void insert(int key){
split(rt,key,x,y);
rt=merge(merge(x,add(key)),y);
}
void del(int key){
split(rt,key-1,x,z);
split(rt,key,x,y);
y=merge(tr[y].l,tr[y].r);
rt=merge(merge(x,y),z);
}
int get_rank(int key){
split(rt,key-1,x,y);
key=tr[x].siz+1;
rt=merge(x,y);
return key;
}
int get_num(int rank){
int p=rt;
while(p){
if(tr[tr[p].l].siz+1==rank){
break;
}else if(tr[tr[p].l].siz>=rank){
p=tr[p].l;
}else{
rank-=tr[tr[p].l].siz+1;
p=tr[p].r;
}
}
return tr[p].key;
}
int pre(int key){
split(rt,key-1,x,y);
int p=x;
while(tr[p].r)p=tr[p].r;
key=tr[p].key;
rt=merge(x,y);
return key;
}
int nxt(int key){
split(rt,key,x,y);
int p=y;
while(tr[p].l)p=tr[p].l;
key=tr[p].key;
rt=merge(x,y);
return key;
}
int n,op,key;
signed main(){
cin>>n;
while(n--){
cin>>op>>key;
if(op==1){
insert(key);
}else if(op==2){
del(key);
}else if(op==3){
cout<<get_rank(key)<<endl;
}else if(op==4){
cout<<get_num(key)<<endl;
}else if(op==5){
cout<<pre(key)<<endl;
}else if(op==6){
cout<<nxt(key)<<endl;
}
}
return 0;
}
只有七分。。。
时间复杂度不是问题(csdn好多题解都是用fhq-treap过的)。
为什么呢?悬两关