fhqtreap T&M52pts求调
查看原帖
fhqtreap T&M52pts求调
123383
未知名网友楼主2024/9/23 19:13
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1100005;
int ck,root,t1,t2,t3,seed=1;
struct fhq{
	int ls,rs,sz;
	ll key,val;
}tr[maxn];
inline int xj(int v){
	tr[++ck]={0,0,1,rand(),v};
	return ck;
}
inline void pushup(int u){
	tr[u].sz=tr[tr[u].ls].sz+tr[tr[u].rs].sz+1;
	return;
}
void split(int u,int v,int &x,int &y){
	if(!u){
		x=y=0;
		return; 
	}
	if(tr[u].val>v){
		y=u;
		split(tr[u].ls,v,x,tr[u].ls);
	}
	else{
		x=u;
		split(tr[u].rs,v,tr[u].rs,y);
	}
	pushup(u);
	return;
} 
int merge(int x,int y){
	if(!x||!y){
		return x+y;
	}
	if(tr[x].key>tr[y].key){
		tr[x].rs=merge(tr[x].rs,y);
		pushup(x);
		return x;
	}
	else{
		tr[y].ls=merge(x,tr[y].ls);
		pushup(y);
		return y;
	}
}
void insert(int v){
	split(root,v,t1,t2);
	root=merge(merge(t1,xj(v)),t2);
}
void erace(int v){
	split(root,v,t1,t2);
	split(t1,v-1,t2,t3);
	t3=merge(tr[t3].ls,tr[t3].rs);
	root=merge(merge(t1,t3),t2);
}
int find_rank(int x){
	split(root,x-1,t1,t2);
	int ans=tr[t1].sz+1;
	root=merge(t1,t2);
	return ans;
}
ll kth(int k){
	int u=root;
	while(u){
		int tmp=tr[tr[u].ls].sz+1;
		if(k==tmp){
			break;
		}
		else if(k<tmp){
			u=tr[u].ls;
		}
		else{
			u=tr[u].rs;
			k-=tmp;
		}
	}
	return tr[u].val;
}
ll pre(int x){
	split(root,x-1,t1,t2);
	int u=t1;
	while(tr[u].rs){
		u=tr[u].rs;
	}
	root=merge(t1,t2);
	return tr[u].val;
}
ll next(int x){
	split(root,x,t1,t2);
	int u=t2;
	while(tr[u].ls){
		u=tr[u].ls;
	}
	root=merge(t1,t2);
	return tr[u].val;
}
inline int read(){
	int num=0;
	char c;
	c=getchar();
	while(c<'0'||c>'9'){
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		num=num*10+c-48;	
		c=getchar();
	}
	return num;
}
int main(){
	int a,flag,x,n,m,ans=0,last=0;
	n=read();
	m=read();
	srand(11);
	for(int i=1;i<=n;++i){
		a=read();
		insert(a);
	} 
	for(int i=1;i<=m;++i){
		flag=read();
		x=read()^last;
		if(flag==1){
			insert(x);
		}
		else if(flag==2){
			erace(x);
		}
		else if(flag==3){
			last=find_rank(x);
			ans^=last;
		}
		else if(flag==4){
			last=kth(x);
			ans^=last;
		}
		else if(flag==5){
			last=pre(x);
			ans^=last;
		}
		else if(flag==6){
			last=next(x);
			ans^=last;
		}
	}
	cout<<ans;
}
2024/9/23 19:13
加载中...