Submission #1349561

#TimeUsernameProblemLanguageResultExecution timeMemory
1349561Kirill22Bridges (APIO19_bridges)C++20
100 / 100
2784 ms8260 KiB
#include "bits/stdc++.h"

using namespace std;

using ll = long long;

struct dsu {
    vector<int> p;
    vector<int> sz;
    vector<pair<int&, int>> chg;
    vector<int> t;

    dsu(int n) {
        p.resize(n);
        std::iota(p.begin(), p.end(), 0);
        sz.resize(n, 1);
    }

    void clear() {
        chg.clear(); t.clear();
        std::iota(p.begin(), p.end(), 0);
        std::fill(sz.begin(), sz.end(), 1);
    }

    void save() {
        t.push_back(chg.size());
    }

    void rollback() {
        while (chg.size() > t.back()) {
            chg.back().first = chg.back().second;
            chg.pop_back();
        }
        t.pop_back();
    }

    int get(int v) {
        return v == p[v] ? v : get(p[v]);
    }

    void merge(int v, int u) {
        v = get(v), u = get(u);
        if (v != u) {
            if (sz[v] > sz[u]) swap(v, u);
            chg.push_back({sz[u], sz[u]});
            chg.push_back({p[v], p[v]});
            p[v] = u;
            sz[u] += sz[v];
        }
    }
};

const int K = 400;

void solve () {
    int n, m;
    cin >> n >> m;
    dsu dsu(n);
    vector<array<int, 3>> edges(m);
    for (auto& [x, y, w] : edges) {
        cin >> x >> y >> w;
        x--, y--;
    }
    int q; cin >> q;
    vector<array<int, 3>> Q(q);
    for (auto& [x, y, z] : Q) {
        cin >> x >> y >> z;
        y--;
    }
    vector<int> ans(q, 0), ban(m); int T = 0;
    for (int l = 0; l < q; l += K) {
        int r = min(q, l + K);
        dsu.clear();
        set<int> special;
        vector<array<int, 3>> cur_Q;
        for (int i = l; i < r; i++) {
            if (Q[i][0] == 1) {
                special.insert(Q[i][1]);
            } else {
                cur_Q.push_back({Q[i][2], Q[i][1], i});
            }
        }
        vector<array<int, 3>> cur_edges;
        for (int i = 0; i < m; i++) {
            if (special.find(i) == special.end()) {
                cur_edges.push_back({edges[i][2], edges[i][0], edges[i][1]});
            }
        }
        std::sort(cur_edges.begin(), cur_edges.end());
        std::reverse(cur_edges.begin(), cur_edges.end());
        int uk = 0;
        std::sort(cur_Q.begin(), cur_Q.end());
        std::reverse(cur_Q.begin(), cur_Q.end());
        for (auto& [w, v, qi] : cur_Q) {
            while (uk < cur_edges.size() && cur_edges[uk][0] >= w) {
                dsu.merge(cur_edges[uk][1], cur_edges[uk][2]);
                uk++;
            }
            T++;
            vector<pair<int, int>> add;
            for (int i = qi; i >= l; i--) {
                if (Q[i][0] == 1) {
                    int j = Q[i][1];
                    if (ban[j] != T) {
                        ban[j] = T;
                        if (Q[i][2] >= w) {
                            add.push_back({edges[j][0], edges[j][1]});
                        }
                    }
                }
            }
            for (auto& j : special) {
                if (ban[j] != T) {
                    if (edges[j][2] >= w) {
                        add.push_back({edges[j][0], edges[j][1]});
                    }
                }
            }
            dsu.save();
            for (auto& [x, y] : add) {
                dsu.merge(x, y);
            }
            ans[qi] = dsu.sz[dsu.get(v)];
            dsu.rollback();
        }
        for (int i = l; i < r; i++) {
            if (Q[i][0] == 1) {
                edges[Q[i][1]][2] = Q[i][2];
            } else {
            }
        }
    }
    for (auto& x : ans) {
        if (x) {
            cout << x << '\n';
        }
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
//    cin >> t;
    while (t--) {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...