RE求条
查看原帖
RE求条
554574
gyyyyx楼主2024/3/31 15:31

全RE,代码如下:

#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,m,v[N];
int fa[N],son[N][2],s[N];
bool rev[N];
inline bool isRoot(int p){
	return son[fa[p]][0]!=p&&son[fa[p]][1]!=p;
}
inline void pushup(int p){
	s[p]=s[son[p][0]]^v[p]^s[son[p][1]];
}
inline void reverse(int p){
	swap(son[p][0],son[p][1]);rev[p]^=1;
}
inline void pushdown(int p){
	if(!rev[p]) return;
	if(son[p][0]) reverse(son[p][0]);
	if(son[p][1]) reverse(son[p][1]);
	rev[p]=0;
}
void update(int p) {
	if(!isRoot(p)) update(fa[p]);
	pushdown(p);
}
inline int dir(int p){
	return son[fa[p]][1]==p;
}
inline bool rotate(int p){
	int f(fa[p]),g(fa[f]),d(dir(p));
	if(!isRoot(f)) son[g][dir(f)]=p;
	son[f][d]=son[p][d^1];fa[son[p][d^1]]=f;
	son[p][d^1]=f;fa[f]=p;fa[p]=g;
	pushup(f);pushup(p);
}
inline void Splay(int p){
	update(p);
	for(int f(fa[p]);!isRoot(p);rotate(p),f=fa[p])
		if(!isRoot(f)) rotate(dir(f)^dir(p)?p:f);
}
inline void Access(int x){
	for(int p(0);x;p=x,x=fa[x])
		Splay(x),son[x][1]=p,pushup(x);
}
inline void makeRoot(int p){
	Access(p);Splay(p);reverse(p);
}
inline int findRoot(int p){
	Access(p);Splay(p);
	while(son[p][0])
		pushdown(p=son[p][0]);
	Splay(p);
	return p;
}
inline void Link(int x,int y){
	makeRoot(x);
	if(findRoot(y)^x) fa[x]=y;
}
inline void Cut(int x,int y){
	makeRoot(x);
	if(findRoot(y)==x&&fa[y]==x&&!son[y][0]){
		fa[y]=son[x][1]=0;
		pushup(x);
	}
}
inline void Split(int x,int y){
	makeRoot(x);Access(y);Splay(y);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i(1);i<=n;++i) scanf("%d",&v[i]);
	while(m--){
		int opt,x,y;
		scanf("%d%d%d",&opt,&x,&y);
		if(opt==0){
			Split(x,y);
			printf("%d\n",s[y]);
		}
		else if(opt==1) Link(x,y);
		else if(opt==2) Cut(x,y);
		else{
			Splay(x);
			v[x]=y;
			pushup(x);
		}
	}
	return 0;
}
2024/3/31 15:31
加载中...