刚开始学平衡树,想先写个二叉搜索树得一个20分再说,但不知道哪出了问题。
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int val;
int l,r;
int siz,cnt;
} T[100005];
int root=1;
void init()
{
T[root].val=1e8;
}
int create(int x)
{
static int tot=1;
T[++tot]={x,0,0,0,0};
return tot;
}
int insert(int& rt,int x)//rt子树插入x
{
if(rt==0) rt=create(x);
if(T[rt].val==x)
{
T[rt].cnt++,T[rt].siz++;
return rt;
}
int pos;
if(x<T[rt].val) pos=insert(T[rt].l,x);
else pos=insert(T[rt].r,x);
return pos;
}
int remove(int rt,int x)//rt子树删除x
{
if(rt==0) return 0;
if(T[rt].val==x)
{
if(T[rt].cnt==0) return 0;
T[rt].cnt--,T[rt].siz--;
return rt;
}
int pos;
if(x<T[rt].val) pos=remove(T[rt].l,x);
else pos=remove(T[rt].r,x);
if(pos!=0) T[rt].siz--;
return pos;
}
int rnk(int x)//小于x的个数
{
int rt=root,ans=0;
while(rt!=0)
{
if(x<=T[rt].val) rt=T[rt].l;
else ans+=T[T[rt].l].siz,rt=T[rt].r;
}
return ans;
}
int query(int k)//排名为k
{
int rt=root;
if(T[rt].siz<k) return 0x7fffffff;
while(1)
{
if(T[T[rt].l].siz>=k) rt=T[rt].l;
else if(T[T[rt].l].siz+T[rt].cnt>=k) return T[rt].val;
else rt=T[rt].r,k-=(T[T[rt].l].siz+T[rt].cnt);
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int p,q;
cin>>p>>q;
if(p==1) insert(root,q);
if(p==2) remove(root,q);
if(p==3) cout<<(rnk(q)+1);
if(p==4) cout<<query(q);
if(p==5) cout<<query(rnk(q));
if(p==6) cout<<query(rnk(q+1)+1);
}
return 0;
}