无treap
// Problem: P3369 【模板】普通平衡树
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3369
// Memory Limit: 128 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
struct BST{
int l,r;
int val,cnt,siz;
}bst[100001];
int tot;
void insert(int &k,int val){
if(!k){
k=++tot;
bst[k].val=val;
bst[k].cnt=bst[k].siz=1;
bst[k].l=bst[k].r=0;
return ;
}
bst[k].siz++;
if(bst[k].val==val){
bst[k].cnt++;
return ;
}
if(bst[k].val>val) insert(bst[k].l,val);
if(bst[k].val<val) insert(bst[k].r,val);
}
int ans;
void get_pre(int k,int val){
if(!k) return ;
if(bst[k].val>val) get_pre(bst[k].l,val);
if(bst[k].val<val) ans=k,get_pre(bst[k].r,val);
}
void get_nxt(int k,int val){
if(!k) return ;
if(bst[k].val>val) ans=k,get_nxt(bst[k].l,val);
if(bst[k].val<val) get_nxt(bst[k].r,val);
}
int dell(int &p){
if(!bst[p].l){
int u=p;
p=bst[p].r;
return u;
}
else{
int u=dell(bst[p].l);
bst[p].siz-=bst[u].cnt;
return u;
}
}
void del(int &k,int val){
bst[k].siz--;
if(k==0) return ;
if(bst[k].val==val){
if(bst[k].cnt>1){
bst[k].cnt--;
return ;
}
if(bst[k].l&&bst[k].r){
k=dell(bst[k].r);
}
else{
k=bst[k].l+bst[k].r;
}
return ;
}
if(bst[k].val>val) del(bst[k].l,val);
if(bst[k].val<val) del(bst[k].r,val);
}
int get_rank(int k,int val){
if(bst[k].val==val) return bst[bst[k].l].siz+1;
if(bst[k].val>val) return get_rank(bst[k].l,val);
if(bst[k].val<val) return get_rank(bst[k].r,val)+bst[bst[k].l].siz+bst[k].cnt;
}
int get_val(int k,int rnk){
if(bst[bst[k].l].siz>=rnk) return get_val(bst[k].l,rnk);
if(bst[bst[k].l].siz<rnk-bst[k].cnt) return get_val(bst[k].r,rnk-bst[bst[k].l].siz-bst[k].cnt);
return bst[k].val;
}
int rt;
int main(){
int n;
rt=1;
cin>>n;
while(n--){
int op,x;
cin>>op>>x;
if(op==1){
insert(rt,x);
}
else if(op==2){
del(rt,x);
}
else if(op==3){
cout<<get_rank(rt,x)<<"\n";
}
else if(op==4){
cout<<get_val(rt,x)<<"\n";
}
else if(op==5){
get_pre(rt,x);
cout<<bst[ans].val<<"\n";
}
else if(op==6){
get_nxt(rt,x);
cout<<bst[ans].val<<"\n";
}
}
return 0;
}
是get_rnk函数死循环了,但是不知道怎么改