提交时间:2023-01-19 10:27:20

运行 ID: 67768

#include<bits/stdc++.h> using namespace std; template<typename T>void in(T &a) { T ans=0; char c=getchar(); for(;c<'0'||c>'9';c=getchar()); for(;c>='0'&&c<='9';c=getchar())ans=ans*10+c-'0'; a=ans; } struct edge{ int u,v,nxt; long long w; }e[90005]; int head[45005],cnt=1,num,n,m; long long a[45005],w; void addedge(int u,int v,long long w){ cnt++,e[cnt].u=u,e[cnt].v=v,e[cnt].w=w,e[cnt].nxt=head[u],head[u]=cnt; } void dfs(int pos,int fa){ for(int i=head[pos];i;i=e[i].nxt)if(e[i].v!=fa)a[e[i].v]=a[pos]^e[i].w,dfs(e[i].v,pos); } int main(){ in(n),in(m); for(int i=1,u,v;i<n;i++)in(u),in(v),in(w),addedge(u,v,w),addedge(v,u,w); dfs(1,0); for(int i=1,opt,x;i<=m;i++){ in(opt),in(x); if(opt==1){ long long ans=0; for(int j=1;j<=n;j++)ans=max(ans,a[x]^a[j]); printf("%lld\n",ans); } else if(opt==2){ long long ans=0; for(int j=1;j<=n;j++)ans+=a[x]^a[j]; printf("%lld\n",ans); } else if(opt==3)in(w),e[x<<1].w=e[x<<1|1].w=w,dfs(1,0); } return 0; }