TLE + WA help
查看原帖
TLE + WA help
590600
Kreado楼主2023/4/8 16:18
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll Maxn=2e5+7;
ll head[Maxn],tot,N,Q,w[Maxn],wt[Maxn],id[Maxn],top[Maxn],fa[Maxn],sz[Maxn],son[Maxn],dep[Maxn],cnt;
struct edge1{
	ll u,v,Next;
}Edge[Maxn<<1];
inline void add(ll u,ll v){
	Edge[++tot]=(edge1){u,v,head[u]},head[u]=tot;
}
void dfs_dep(ll u,ll father){
	fa[u]=father;
	dep[u]=dep[father]+1;
	sz[u]=1;
	for(ll i=head[u];i;i=Edge[i].Next){
		ll v=Edge[i].v;
		if(v==father) continue;
		dfs_dep(v,u);
		sz[u]+=sz[v];
		if(sz[v]>sz[son[u]]) son[u]=v;
	}
}
void dfs_new(ll u,ll topx){
	id[u]=++cnt;
	wt[cnt]=w[u];
	top[u]=topx;
	if(son[u]) dfs_new(son[u],topx);
	for(ll i=head[u];i;i=Edge[i].Next){
		ll v=Edge[i].v;
		if(v!=son[u]&&v!=fa[u]) dfs_new(v,v);
	}
}
struct TREE{
	ll num,l,r,tag;
}tree[Maxn<<2];
inline void pushup(ll node){
	tree[node].num=(tree[node<<1].num^tree[node<<1|1].num);
}
inline void buildtree(ll node,ll l,ll r){
	tree[node].l=l,tree[node].r=r;
	if(l==r){
		tree[node].num=wt[l];
		return ;
	}
	ll mid=l+r>>1;
	buildtree(node<<1,l,mid);
	buildtree(node<<1|1,mid+1,r);
	pushup(node);
}
inline void modify(ll node,ll x,ll val){
	if(tree[node].l==tree[node].r){
		tree[node].num=val;
		return ;
	}
	ll mid=tree[node].l+tree[node].r>>1;
	if(x<=mid) modify(node<<1,x,val);
	else modify(node<<1|1,x,val);
	pushup(node);
}
inline ll query(ll node,ll l,ll r){
	if(tree[node].l==tree[node].r) return tree[node].num;
	ll mid=tree[node].l+tree[node].r>>1,ans=0;
	if(l<=mid) ans=ans^query(node<<1,l,r);
	if(r>mid) ans=ans^query(node<<1|1,l,r);
	return ans;
}
inline void updateRange(ll x,ll val){
	modify(1,id[x],val);
}
inline ll queryRange(ll x,ll y){
	ll ans=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans=ans^query(1,id[x],id[top[x]]);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	ans=ans^query(1,id[x],id[y]);
	return ans;
}
int main(){
	scanf("%lld%lld",&N,&Q);
	for(ll i=1;i<=N;i++) scanf("%lld",&w[i]);
	for(ll i=1,u,v;i<=N-1;i++)
		scanf("%lld%lld",&u,&v),add(u,v),add(v,u);
	dfs_dep(1,0);
	dfs_new(1,1);
	buildtree(1,1,N);
	while(Q--){
		ll opt,x,y;
		scanf("%lld%lld%lld",&opt,&x,&y);
		if(opt==1) updateRange(x,y);
		if(opt==2) printf("%lld\n",queryRange(x,y));
	}
	return 0;
}
2023/4/8 16:18
加载中...