#include<bits/stdc++.h>
using namespace std;
using ll = long long;
struct DSU {
    vector<int> p;
    DSU() = default;
    DSU(int n) : p(n) {
        iota(p.begin(), p.end(), 0);
    }
    int get(int u) {
        while (u != p[u]) u = p[u] = p[p[u]];
        return u;
    }
    bool unite(int u, int v) {
        u = get(u), v = get(v);
        if (u == v) return false;
        p[v] = u;
        return true;
    }
};
signed main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int n, m, q;
    cin >> n >> m >> q;
    vector<ll> s(n);
    for (auto& i : s) cin >> i;
    vector<tuple<ll, int, int>> edges;
    ll base = *max_element(s.begin(), s.end()) - accumulate(s.begin(), s.end(), 0ll);
    for (int i = 0; i < m; ++i) {
        int u, v;
        cin >> u >> v;
        --u, --v;
        edges.emplace_back(s[u] + s[v], u, v);
    }
    sort(edges.begin(), edges.end());
    ll mst = 0;
    DSU dsu(n);
    for (auto [w, u, v] : edges) {
        mst += w * dsu.unite(u, v);
    }
    cout << mst + base;
}
| # | 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... |