91pts,第九个点WA
代码:
#include<iostream>
using namespace std;
#define ll long long
const ll N=3e5+5;
ll n,m,val[N];
struct LCT{
ll top,son[N][2],Xor[N],fa[N],rev[N],sta[N];
void pushup(int x){
Xor[x]=Xor[son[x][0]]^Xor[son[x][1]]^val[x];
}
void pushdown(int x){
int l=son[x][0],r=son[x][1];
if(rev[x]){
rev[l]^=1,rev[r]^=1,rev[x]^=1;
swap(son[x][0],son[x][1]);
}
}
bool isroot(int x){
return son[fa[x]][0]!=x&&son[fa[x]][1]!=x;
}
void rotate(int x){
int y=fa[x],z=fa[y],l,r;
if(son[y][0]==x) l=0;
else l=1;
r=l^1;
if(!isroot(y)){
if(son[z][0]==y) son[z][0]=x;
else son[z][1]=x;
}
fa[x]=z,fa[y]=x,fa[son[x][r]]=y;
son[y][l]=son[x][r];son[x][r]=y;
pushup(y);pushup(x);
}
void splay(int x){
top=0;
sta[++top]=x;
for(int i=x;!isroot(i);i=fa[i]) sta[++top]=fa[i];
for(int i=top;i;--i) pushdown(sta[i]);
while(isroot(x)==0){
int y=fa[x],z=fa[y];
if(!isroot(y)){
if((son[y][0]==x)^(son[z][0]==y)) rotate(x);
else rotate(y);
}
rotate(x);
}
}
void acc(int x){
for(int t=0;x;t=x,x=fa[x]){
splay(x);
son[x][1]=t;
pushup(x);
}
}
void makeroot(int x){
acc(x);
splay(x);
rev[x]^=1;
}
int find(int x){
acc(x);
splay(x);
pushdown(x);
while(son[x][0]) pushdown(x),x=son[x][0];
splay(x);
return x;
}
void split(int x,int y){
makeroot(x);
acc(y);
splay(y);
}
void link(int x,int y){
makeroot(x);
fa[x]=y;
}
void cut(int x,int y){
makeroot(x);
if(son[y][0]==x&&!son[x][1]) son[y][0]=0,fa[x]=0,pushup(y);
}
};
LCT T;
int main(){
cin>>n>>m;
for(int i=1;i<=n;++i) cin>>val[i],T.Xor[i]=val[i];
while(m--){
int opt;
cin>>opt;
if(opt==0){
int x,y;
cin>>x>>y;
T.split(x,y);
cout<<T.Xor[y]<<endl;
}
if(opt==1){
int x,y;
cin>>x>>y;
int X=T.find(x),Y=T.find(y);
if(X!=Y) T.link(x,y);
}
if(opt==2){
int x,y;
cin>>x>>y;
int X=T.find(x),Y=T.find(y);
if(X!=Y) T.cut(x,y);
}
if(opt==3){
int x,y;
cin>>x>>y;
T.acc(x);T.splay(x);val[x]=y;
T.pushup(x);
}
}
}