应该是进死循环了,在 56 行的那个判非法情况的地方退出了,求调/kk
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cstdlib>
using namespace std;
const int NR=1000050;
int n,m;
struct point{
int val,sum;
int fa,s[3];
int sz;
int spn,tag;
void newp(int id,int v){
val=id;sum=v;
fa=s[0]=s[1]=0;
sz=1;spn=0;tag=0;
}
}pt[NR];
int rt=0;
void check(){
for(int i=1;i<=n;i++){
printf("%d : fa %d, [%d-%d],val %d,sum%d,spn%d,sz%d\n",i,pt[i].fa,pt[i].s[0],pt[i].s[1],pt[i].val,pt[i].sum,pt[i].spn,pt[i].sz);
}
}
inline int get(int x){
if(pt[x].fa==0)return 2;
if(x==pt[pt[x].fa].s[1])return 1;
if(x==pt[pt[x].fa].s[0])return 0;
return 2;
}
void push_up(int p){
pt[p].sz=pt[pt[p].s[0]].sz+pt[pt[p].s[1]].sz+1;
pt[p].sum=pt[pt[p].s[0]].sum^pt[pt[p].s[1]].sum^pt[p].val;
}
void push_down(int p){
if(pt[p].spn==1){
swap(pt[p].s[0],pt[p].s[1]);
pt[pt[p].s[0]].spn^=1;
pt[pt[p].s[1]].spn^=1;
pt[p].spn=0;
}
}
void deal(int p){
if(get(p)!=2)deal(pt[p].fa);
push_down(p);
}
namespace splay{
int ptot=0;
void sp(int p){
int fa=pt[p].fa,ls=pt[p].s[0],rs=pt[p].s[1];
if(get(p)==2){
cout<<"FALSE";
}
if(get(p)==0){
pt[fa].s[0]=rs;pt[rs].fa=fa;
pt[p].fa=pt[fa].fa;pt[pt[fa].fa].s[get(fa)]=p;
pt[fa].fa=p;pt[p].s[1]=fa;
}else{
pt[fa].s[1]=ls;pt[ls].fa=fa;
pt[p].fa=pt[fa].fa;pt[pt[fa].fa].s[get(fa)]=p;
pt[fa].fa=p;pt[p].s[0]=fa;
}
push_up(fa),push_up(p);
}
void splay(int p){
int fa=pt[p].fa;
deal(p);
while(get(p)!=2&&get(fa)!=2){
if(get(p)==get(fa))sp(fa),sp(p);
else sp(p),sp(p);
}
if(get(p)!=2)sp(p);
}
}
int access(int p){
int rs=0;
while(p!=0){
splay::splay(p);
pt[p].s[1]=rs;
push_up(p);
rs=p;p=pt[p].fa;
}
return p;
}
void makeroot(int p){
access(p);
splay::splay(p);
pt[p].spn^=1;push_down(p);
}
void link(int x,int y){
makeroot(x);
int p=y;while(pt[p].fa!=0)p=pt[p].fa;
if(p==x){
// printf("l");
return;
}
pt[x].fa=y;
push_up(y);
}
void cut(int x,int y){
makeroot(x);
access(y);
if(pt[x].sz!=2){
// printf("r");
return;
}
pt[x].s[1]=0;pt[y].fa=0;push_up(y);
}
int query(int x,int y){
makeroot(x);
access(y);
splay::splay(y);
return pt[y].sum;
}
void mdf(int p,int v){
splay::splay(p);
pt[p].val=v;
push_up(p);
}
int main(){
// freopen("P3690.in","r",stdin);
// freopen("P3690.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>pt[i].val;push_up(i);
}
for(int i=1;i<=m;i++){
int op,x,y;cin>>op>>x>>y;
if(op==0){
cout<<query(x,y)<<endl;
}
if(op==1){
link(x,y);
}
if(op==2){
cut(x,y);
}
if(op==3){
mdf(x,y);
}
// check();
}
return 0;
}