#include <bits/stdc++.h>
using namespace std;
struct ufds {
	int n;
	vector<int> par;
	ufds(int _n): n(_n), par(_n,-1) {}
	int onion(int x) {return (par[x]<0?x:par[x]=onion(par[x]));}
	bool unite(int x, int y) {
		x=onion(x), y=onion(y);
		if(x==y)
			return 0;
		if(par[x]<par[y])
			swap(x,y);
		par[y]+=par[x];
		par[x]=y;
		return 1;
	}
};
int main() {
	int n, m, q;
	cin >> n >> m >> q;
	int s[n], d[n];
	for(int i=0;i<n;i++)
		cin >> s[i];
	memset(d,0,sizeof(d));
	vector<tuple<int,int,int>> edge;
	for(int i=0;i<m;i++) {
		int a, b;
		cin >> a >> b;
		a--; b--;
		edge.push_back({s[a]+s[b],a,b});
	}
	sort(edge.begin(),edge.end());
	long long ans = 0;
	ufds u(n);
	for(int i=0;i<m;i++)
		if(u.unite(get<1>(edge[i]),get<2>(edge[i])))
			ans += get<0>(edge[i]);
	for(int i=0;i<n;i++)
		ans -= s[i];
	ans += *max_element(s,s+n);
	cout << ans;
}
| # | 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... |