Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Make CSP great again
- //Vengeance
- #include <bits/stdc++.h>
- #define TASK "TESTCODE"
- #define Log2(x) 31 - __builtin_clz(x)
- using namespace std;
- const int N = 2e4, M = 1e5;
- int last[M + 1];
- struct DSU
- {
- int lab[N + 1];
- void reset(int n)
- {
- fill(lab + 1, lab + n + 1, -1);
- }
- int FindSet(int u)
- {
- return lab[u] < 0 ? u : lab[u] = FindSet(lab[u]);
- }
- bool unite(int u, int v)
- {
- u = FindSet(u);
- v = FindSet(v);
- if (u == v)
- {
- return false;
- }
- if (lab[u] > lab[v])
- {
- swap(u, v);
- }
- lab[u] += lab[v];
- lab[v] = u;
- return true;
- }
- } dsu1, dsu2;
- struct edge
- {
- int l, r;
- int u, v, w;
- edge(int _l, int _r, int _u, int _v, int _w)
- {
- l = _l;
- r = _r;
- u = _u;
- v = _v;
- w = _w;
- }
- bool operator < (const edge & other) const
- {
- return w < other.w;
- }
- };
- int x[M + 1], y[M + 1], w[M + 1], id[M + 1];
- int n, m, q;
- vector<edge> all;
- void read()
- {
- cin >> n >> m >> q;
- for (int i = 1; i <= m; ++ i)
- {
- cin >> x[i] >> y[i] >> w[i];
- }
- for (int i = 1; i <= q; ++ i)
- {
- int k, d;
- cin >> k >> d;
- all.emplace_back(last[k], i - 1, x[k], y[k], w[k]);
- last[k] = i;
- w[k] = d;
- }
- for (int i = 1; i <= m; ++ i)
- {
- all.emplace_back(last[i], q, x[i], y[i], w[i]);
- }
- sort(all.begin(), all.end());
- }
- void DnC(int l, int r, int n, vector<edge> e, long long sum)
- {
- e.erase(stable_partition(e.begin(), e.end(), [&](const edge &u) {return !(u.r < l || u.l > r);}), e.end());
- dsu1.reset(n);
- dsu2.reset(n);
- for (int i = 0; i < e.size(); ++ i)
- {
- if (e[i].r < r || e[i].l > l)
- {
- dsu1.unite(e[i].u, e[i].v);
- }
- }
- for (int i = 0; i < e.size(); ++ i)
- {
- if (e[i].l <= l && e[i].r >= r)
- {
- if (dsu1.unite(e[i].u, e[i].v))
- {
- sum += e[i].w;
- dsu2.unite(e[i].u, e[i].v);
- }
- }
- }
- if (l == r)
- {
- if (l > 0)
- {
- cout << sum << '\n';
- }
- return;
- }
- int sz = 0;
- for (int i = 1; i <= n; ++ i)
- {
- if (dsu2.lab[i] < 0)
- {
- id[i] = ++sz;
- }
- }
- dsu1.reset(n);
- for (int i = 0; i < e.size(); ++ i)
- {
- e[i].u = id[dsu2.FindSet(e[i].u)];
- e[i].v = id[dsu2.FindSet(e[i].v)];
- if (e[i].l <= l && e[i].r >= r && !dsu1.unite(e[i].u, e[i].v))
- {
- e[i].r = -1e9;
- e[i].l = 1e9;
- }
- }
- int mid = (l + r)/2;
- DnC(l, mid, sz, e, sum);
- DnC(mid + 1, r, sz, e, sum);
- }
- void solve()
- {
- DnC(0, q, n, all, 0);
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- if (fopen(TASK".INP", "r"))
- {
- freopen(TASK".INP", "r", stdin);
- //freopen(TASK".OUT", "w", stdout);
- }
- int t = 1;
- bool typetest = false;
- if (typetest)
- {
- cin >> t;
- }
- for (int __ = 1; __ <= t; ++ __)
- {
- //cout << "Case " << __ << ": ";
- read();
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement