WA 56
查看原帖
WA 56
345900
Haber楼主2022/12/15 10:47

看上去没有问题。

long long 没有关系。

#include<bits/stdc++.h>
#define lid id<<1
#define rid id<<1|1
using namespace std;
int n,Q;
const int N=1e5+5;
int h[N],ne[N<<1],to[N<<1],idx;
int cnt,son[N],siz[N],dep[N],top[N],fa[N],dfn[N],rk[N];
int e[N];
struct tree{
	int l,r,val;
}tr[N<<2];
void add(int a,int b){
	to[++idx]=b;
	ne[idx]=h[a];
	h[a]=idx;
}
void dfs1(int x){
	siz[x]=1,son[x]=-1;
	for(int i=h[x];i!=-1;i=ne[i]){
		int j=to[i];
		if(j==fa[x]) continue;
		dep[j]=dep[x]+1;
		fa[j]=x;
		dfs1(j);
		siz[x]+=siz[j];
		if(son[x]==-1||siz[j]>siz[son[x]]) son[x]=j;
	}
}
void dfs2(int x,int tp){
	top[x]=tp;
	dfn[x]=++cnt;
	rk[cnt]=x;
	if(son[x]==-1) return ;
	dfs2(son[x],tp);
	for(int i=h[x];i!=-1;i=ne[i]){
		int j=to[i];
		if(j!=son[x]&&j!=fa[x]) dfs2(j,j);
	}
}
void build(int id,int l,int r){
	tr[id].l=l,tr[id].r=r;
	if(l==r){
		tr[id].val=e[rk[l]];
		return ;
	}
	int mid=(l+r)>>1;
	build(lid,l,mid);
	build(rid,mid+1,r);
	tr[id].val=tr[lid].val^tr[rid].val;
}
void modify(int id,int x,int v){
	if(tr[id].l==tr[id].r){
		tr[id].val=v;
		return;
	}
	int mid=(tr[id].l+tr[id].r)>>1;
	if(x<=mid) modify(lid,x,v);
	else modify(rid,x,v);
	tr[id].val=tr[lid].val^tr[rid].val;
}
int query(int id,int l,int r){
	if(tr[id].l==l&&tr[id].r==r) return tr[id].val;
	int mid=(tr[id].l+tr[id].r)>>1;
	if(r<=mid) return query(lid,l,r);
	else if(l>mid) return query(rid,l,r);
	else return query(lid,l,mid)^query(rid,mid+1,r);
}
int main(){
	memset(h,-1,sizeof h);
	scanf("%d%d",&n,&Q);
	for(int i=1;i<=n;i++) scanf("%d",&e[i]);
	for(int i=1;i<n;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		add(a,b),add(b,a);
	}
	dfs1(1),dfs2(1,1);
	build(1,1,n);
	while(Q--){
		int op,x,y;
		scanf("%d%d%d",&op,&x,&y);
		if(op==1) modify(1,x,y);
		else{
			int ans=0;
			while(top[x]!=top[y]){
				if(dep[top[x]]<dep[top[y]]) swap(x,y);
				ans^=query(1,dfn[top[x]],dfn[x]);
				x=fa[top[x]];
			}
			if(dfn[x]>dfn[y]) swap(x,y);
			ans^=query(1,dfn[x],dfn[y]);
			printf("%d\n",ans);
		}
	}
	return 0;
} 
2022/12/15 10:47
加载中...