This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct UFDS{
	vector<int> p,siz,mini;
	UFDS(int n,vector<int> arr):p(n+1),siz(n+1,1),mini(n+1){
		iota(p.begin(),p.end(),0);
		mini=arr;
	}
	int findRoot(int x){
		return p[x]==x ? x : p[x]=findRoot(p[x]);
	}
	int unite(int a,int b){
		a = findRoot(a);
		b = findRoot(b);
		if(a==b)return -1;
		if(siz[b]>siz[a])swap(a,b);
		int ans = mini[a]+mini[b];
		mini[a]=min(mini[a],mini[b]);
		siz[a]+=siz[b];
		p[b]=a;
		return ans;
	}
};
int32_t main(){
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	int n,m,q;
	cin >> n >> m >> q;
	vector<int> arr(n+1);
	for(int i=1;i<=n;i++)cin>>arr[i];
	vector<tuple<int,int,int>> edges;
	for(int i=1;i<=m;i++){
		int a,b;
		cin >> a >> b;
		edges.emplace_back(arr[a]+arr[b],a,b);
	}
	sort(edges.begin(),edges.end());
	int baseans = (*max_element(arr.begin(),arr.end()));
	for(int i=1;i<=n;i++){
		baseans-=arr[i];
	}
	UFDS dsu(n,arr);
	priority_queue<int> qu;
	for(int i=0;i<m;i++){
		auto [cost,a,b] = edges[i];
		auto curr = dsu.unite(a,b);
		if(curr==-1)continue;
		baseans+=cost;
		qu.emplace(cost-curr);
	}
	for(int i=0;i<=q;i++){
		cout << baseans << '\n';
		if(!qu.empty()){
			baseans-=qu.top();
			qu.pop();
		}
	}
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |