发生了甚么事?只有 #32 T 了
#include<iostream>
#include<vector>
#include<cstdio>
#define lowbit(x) x&-x
using namespace std;
int n,q,a[200010],b[100010];
vector<int>v[100010];
int dep[100010],fa[100010][20];
int num[100010],cur;
int e[200010],ecur,in[100010],out[100010];
void dfs(int x,int last)
{
e[++ecur]=x,in[x]=ecur;
fa[x][0]=last;
dep[x]=dep[last]+1;
for(int i=1;i<20;i++)
fa[x][i]=fa[fa[x][i-1]][i-1];
for(auto y:v[x])
if(y!=last)dfs(y,x);
e[++ecur]=x,out[x]=ecur;
}
int LCA(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=19;i>=0;i--)
if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
if(x==y)return x;
for(int i=19;i>=0;i--)
if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
void add(int x,int k){
while(x<=2*n)a[x]^=k,x+=lowbit(x);
}
int query(int x)
{
int ans=0;
while(x)ans^=a[x],x-=lowbit(x);
return ans;
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)scanf("%d",&b[i]);
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1,0);
for(int i=1;i<=n;i++)
{
add(in[i],b[i]);
if(fa[i][0])add(in[fa[i][0]],b[i]);
}
while(q--)
{
int op;
scanf("%d",&op);
if(op==1)
{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
int lca=LCA(x,y);
add(in[x],k);
add(in[y],k);
add(in[lca],k);
if(fa[lca][0])add(in[fa[lca][0]],k);
}
else
{
int x,y;
scanf("%d%d",&x,&y);
int lca=LCA(x,y);
int dis=dep[x]+dep[y]-2*dep[lca];
if(dis<=50)
{
cur=0;
int now=x;
while(now!=lca)
{
num[++cur]=query(in[now]-1)^query(out[now]);
now=fa[now][0];
}
now=y;
while(now!=lca)
{
num[++cur]=query(in[now]-1)^query(out[now]);
now=fa[now][0];
}
num[++cur]=query(in[lca]-1)^query(out[lca]);
int flag=0;
for(int i=1;i<=cur;i++)
for(int j=i+1;j<=cur;j++)
for(int k=j+1;k<=cur;k++)
if((long long)num[i]+num[j]>num[k]&&(long long)num[i]+num[k]>num[j]&&(long long)num[j]+num[k]>num[i])
{
flag=1;
break;
}
printf("%d",flag);
}
else printf("1");
}
}
return 0;
}