萌新刚学fhq_treap一秒钟,WA 8pts求调
查看原帖
萌新刚学fhq_treap一秒钟,WA 8pts求调
520056
luoyx楼主2023/8/26 09:18
#include <bits/stdc++.h>
using namespace std;
int n;
int opt,x;
const int N=5e7+55;
struct node{
	int l,r,size,val,key;
}tr[N];
int cnt,rt[N];
void newnode(int x){
	tr[++cnt].val=x;
	tr[cnt].key=rand();
	tr[cnt].size=1;
}
void update(int p){
	tr[p].size=tr[tr[p].l].size+tr[tr[p].r].size+1;
}
void split_val(int p,int val,int &x,int &y){
	if(!p){
		x=y=0;
		return ;
	}
	if(tr[p].val<=val){
		x=++cnt;
		tr[x]=tr[p];
		split_val(tr[x].r,val,tr[x].r,y);
	}
	else{
		y=++cnt;
		tr[y]=tr[p];
		split_val(tr[y].l,val,x,tr[y].l);
	}
	update(p);
}
void split_size(int p,int size,int &x,int &y){
	if(!p){
		x=y=0;
		return ;
	}
	if(size>tr[tr[p].l].size){
		x=++cnt;
		tr[x]=tr[p];
		split_size(tr[x].r,size-tr[tr[x].l].size-1,tr[x].r,y);
	}
	else{
		y=++cnt;
		tr[y]=tr[p];
		split_size(tr[y].l,size,x,tr[y].l);
	}
	update(p);
}
int merge(int x,int y){
	if(x*y==0) return x+y;
	if(tr[x].key<tr[y].key){
		tr[x].r=merge(tr[x].r,y);
		update(x);
		return x;
	}
	else{
		tr[y].l=merge(x,tr[y].l);
		update(y);
		return y;
	}
}
void insert(int &root,int val){
	int x,y,z;
	x=y=z=0;
	split_val(root,val-1,x,y);
	newnode(val);
	root=merge(merge(x,cnt),y);
}
void del(int &root,int val){
	int x,y,z;
	x=y=z=0;
	split_val(root,val,x,y);
	split_val(x,val-1,x,z);
	root=merge(merge(x,merge(tr[z].l,tr[z].r)),y);
}
int query_rank(int &root,int val){
	int x=0,y=0;
	split_val(root,val-1,x,y);
	int ans=tr[x].size+1;
	root=merge(x,y);
	return ans;
}
int query_num(int &root,int rk){
	int x=0,y=0,z=0;
	split_size(root,rk,x,y);
	split_size(x,tr[x].size-1,x,z);
	int ans=tr[z].val;
	root=merge(merge(x,z),y);
	return ans;
}
int query_pre(int &root,int val){
	int x=0,y=0,z=0;
	split_val(root,val-1,x,y);
	split_size(x,tr[x].size-1,x,z);
	int ans=tr[z].val;
	root=merge(merge(x,z),y);
	return ans;
}
int query_post(int &root,int val){
	int x=0,y=0,z=0;
	split_val(root,val,x,y);
	split_size(y,1,y,z);
	int ans=tr[y].val;
	root=merge(x,merge(y,z));
	return ans;
}
int main(){
	cin>>n;
	int ver,aimyon;
	while(n--){
		aimyon++;
		scanf("%d%d%d",&ver,&opt,&x);
		rt[aimyon]=rt[ver];
		if(opt==1){
			insert(rt[aimyon],x);
		}
		else if(opt==2){
			del(rt[aimyon],x);
		}
		else if(opt==3){
			printf("%d\n",query_rank(rt[aimyon],x));
		}
		else if(opt==4){
			printf("%d\n",query_num(rt[aimyon],x));
		}
		else if(opt==5){
			printf("%d\n",query_pre(rt[aimyon],x));
		}
		else if(opt==6){
			printf("%d\n",query_post(rt[aimyon],x));
		}
	}
	return 0;
}
2023/8/26 09:18
加载中...