fhq-treap求调,悬2关
查看原帖
fhq-treap求调,悬2关
614509
c21162wqb楼主2024/1/26 00:17
#include<bits/stdc++.h>
using namespace std;
int cnt,va[100010],ra[100010],ch[100010][2],sz[100010];
int build(int k) {//建新点 
	cnt++;
	va[cnt]=k,ra[cnt]=rand(),sz[cnt]=1; 
	return cnt;
}
void js(int u) {
	sz[u]=sz[ch[u][0]]+sz[ch[u][1]]+1;
} 
void split(int u,int k,int &l,int &r) {//将根为u的平衡树分为根为l,根为r 
	if(u==0) {
		l=r=0;
		return ;
	}
	if(k<=va[u]) split(ch[u][0],k,l,ch[u][0]),r=u;
	else split(ch[u][1],k,ch[u][1],r),l=u;
	js(u);
}
int merge(int x,int y) {//va[x]<va[y] 
    if(x==0||y==0) return x|y;
	if(ra[x]<ra[y]) {//root x
		ch[x][1]=merge(ch[x][1],y);
		js(x);
		return x; 
	}	
	else {
		ch[y][0]=merge(x,ch[y][0]);
		js(y);
		return y;
	}
}
void insert(int &root,int x) {
	int l,r;
	split(root,x,l,r);
	root=merge(merge(l,build(x)),r);
}
void erase(int &root,int x){
	int l,r,u;
	split(root,x,l,r);
	split(root,x+1,u,r);//<x =x >x
	root=merge(merge(l,merge(ch[u][0],ch[u][1])),r);
}
int find(int u,int x) {
	int ans=0; 
	while(u) {
		if(va[u]<x) ans+=sz[ch[u][0]]+1,u=ch[u][1];
		else u=ch[u][0];
	}
	return ans; 
}
int ran(int u,int x) {
	while(u) {
		if(sz[ch[u][0]]==x) break ;
		if(sz[ch[u][0]]>x) u=ch[u][0];
		else x=x-sz[ch[u][0]]-1,u=ch[u][1];
	}
	return va[u];
}
int n,op,x,root;
signed main() {
	srand(time(0));
	cin>>n;
	for(int i=1;i<=n;i++) {
		scanf("%d%d",&op,&x);
		if(op==1) insert(root,x);
		if(op==2) erase(root,x);
		if(op==3) printf("%d\n",find(root,x)+1);
		if(op==4) printf("%d\n",ran(root,x));
		if(op==5) printf("%d\n",find(root,x)-1);
		if(op==6) printf("%d\n",find(root,x-1));
	}
	return 0;
}
2024/1/26 00:17
加载中...