#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = (int)2e5 + 12;
const ll inf = (ll)1e10;
int n, m, q, s[N], sz[N], p[N], f[N];
set<array<ll, 3>> g[N], g1[N];
int get(int v) {
if(p[v] == v) return v;
return p[v] = get(p[v]);
}
bool merge1(int a, int b) {
a = get(a);
b = get(b);
if(a == b) return 0;
p[a] = b;
return 1;
}
priority_queue<array<ll, 3>> st;
ll add;
vector<pair<int, int>> e;
void adde(int i) {
if(!g1[i].empty()) {
auto [val, x, y] = (*g1[i].begin());
// cerr << i << ' ' << x << ' ' << y << "A\n";
assert(get(x) != get(y));
st.push({-(val - f[i]), x, y});
}
}
void make() {
for(int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
e.emplace_back(u, v);
}
sort(e.begin(), e.end(), [&](pair<int, int> x, pair<int, int> y){
int X = (s[x.first] + s[x.second]);
int Y = (s[y.first] + s[y.second]);
return X < Y;
});
vector<pair<int, int>> e_;
for(auto [x, y] : e) {
if(merge1(x, y)) {
e_.emplace_back(x, y);
g1[x].insert({s[y] + s[x], x, y});
g1[y].insert({s[x] + s[y], y, x});
}
}
e.swap(e_);
for(int i = 1; i <= n; i++) {
f[i] = s[i], p[i] = i;
}
for(int i = 1; i <= n; i++) {
adde(i);
}
}
ll res[N];
void test() {
cin >> n >> m >> q;
for(int i = 1, mx = 0; i <= n; i++) {
cin >> s[i];
mx = max(mx, s[i]);
add -= s[i];
p[i] = i;
if(i == n) {
add += mx;
}
}
make();
int mn = s[1];
for(int i = 1; i <= n; i++) {
res[n - 1] += s[i];
mn = min(mn, s[i]);
}
res[n - 1] += mn * 1ll * (n - 2);
int it = n - 2;
while(it >= 0 && (!st.empty())) {
array<ll, 3> j = st.top();
auto [val, x, y] = j;
val *= -1;
st.pop();
if(get(x) == get(y) || val != s[x] + s[y] - max(f[get(x)], f[get(y)])) continue;
int a = get(x), b = get(y);
if((int)g1[a].size() < (int)g1[b].size()) {
swap(x, y);
swap(a, b);
// g1[a].swap(g1[b]);
}
g1[a].erase({s[x] + s[y], x, y});
for(auto [val, x, y] : g1[b]) {
if(get(y) == a) continue;
g1[a].insert({val, x, y});
}
res[it] = res[it + 1] - mn + val;
p[b] = a;
f[a] = min(f[a], f[b]);
adde(a);
it--;
}
for(int k = n; k <= q; k++) {
res[k] = res[k - 1];
}
for(int i = 0; i <= q; i++) {
cout << res[i] + add << '\n';
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int t = 1;
// cin >> t;
while(t--)
test();
}
# | 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... |