10pts,玄关求调
查看原帖
10pts,玄关求调
1662575
Fuchsia楼主2025/8/29 19:25

不知道为什么错了,感觉没有什么太大的问题

#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;
}
2025/8/29 19:25
加载中...