不知道为什么错了,感觉没有什么太大的问题
#include<bits/stdc++.h>
using namespace std;
const int z=1e5+1;
int sum[z];
int u[z],v[z];
bool f[z];
int opt[z];
int val[z];
int a[z],b[z];
int father[z];
int ans[z];
int find(int x){
if(father[x]!=x){
father[x]=find(father[x]);
}
return x;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>sum[i];
father[i]=i;
}
for(int i=1;i<n;i++){
cin>>u[i]>>v[i];
}
for(int i=1;i<=m;i++){
cin>>opt[i];
if(opt[i]==1){
cin>>a[i];
f[a[i]]=1;
}else if(opt[i]==2){
cin>>a[i]>>b[i];
val[i]=sum[a[i]];
sum[a[i]]=b[i];
}else if(opt[i]==3){
cin>>a[i];
}
}
for(int i=1;i<n;i++){
if(f[i]==0){
int u1=find(u[i]);
int v1=find(v[i]);
father[u1]=v1;
sum[v1]+=sum[u1];
}
}
int cnt=0;
for(int i=m;i>=1;i--){
if(opt[i]==1){
int u1=find(u[a[i]]);
int v1=find(v[a[i]]);
father[u1]=v1;
sum[v1]+=sum[u1];
}else if(opt[i]==2){
int root=find(a[i]);
sum[root]+=val[i]-b[i];
}else if(opt[i]==3){
cnt++;
ans[cnt]=sum[find(a[i])];
}
}
for(int i=cnt;i>=1;i--){
cout<<ans[i]<<endl;
}
return 0;
}