那几个点是数据比较大,我开了long long,如果是算法太耗时应该是TLE,但我WA了是什么鬼
50分,WA#4,5,8,9,10
#include<bits/stdc++.h>
using namespace std;
long long n,m,val[100100];
int head[100100],to[200100],next[200100],tot=0;
int c[100100],d[100100];
int fa[100100];
int ans=0;
void add(int x,int y){
to[++tot]=y;
next[tot]=head[x];
head[x]=tot;
}
int inti(int now){
for(int i=head[now];i;i=next[i]){
int nxt=to[i];
if(fa[now]!=nxt){
fa[nxt]=now;
val[now]+=inti(nxt);
}
}
return val[now];
}
int find(int now){
return fa[now]==now?now:find(fa[now]);
}
void dfs(int now){
ans+=val[now];
for(int i=head[now];i;i=next[i]){
int nxt=to[i];
if(fa[nxt]==now) dfs(nxt);
}
}
void update(int now,int num){
val[now]-=num;
if(fa[now]==now) return;
update(fa[now],num);
}
int main(){
int opt,x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&val[i]);
fa[i]=i;
}
for(int i=1;i<n;i++){
scanf("%d%d",&c[i],&d[i]);
add(c[i],d[i]);
add(d[i],c[i]);
}
inti(1);
while(m--){
scanf("%d",&opt);
switch(opt){
case 1:{
scanf("%d",&x);
if(fa[c[x]]==d[x]) fa[c[x]]=c[x],update(d[x],val[c[x]]);
else fa[d[x]]=d[x],update(c[x],val[d[x]]);
break;
}
case 2:{
scanf("%d%d",&x,&y);
int k=val[x];
for(int i=head[x];i;i=next[i]) if(fa[x]!=to[i]) k-=val[to[i]];
update(x,k-y);
break;
}
case 3:{
scanf("%d",&x);
printf("%d\n",val[find(x)]);
break;
}
}
}
}