Submission #1245162

#TimeUsernameProblemLanguageResultExecution timeMemory
1245162nh0902Bridges (APIO19_bridges)C++20
13 / 100
3095 ms25064 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

const int N = 5e4 + 10;

const int M = 1e5 + 10;

const int inf = 1e18;

int n, m, q, sq, k;

int u[M], v[M], d[M], cur_d[M];

int t[M], pos[M], w[M];

int pa[N], sz[N];

stack<pair<int, int>> store;

int ans[M];

void reset_dsu() {
    for (int i = 1; i <= n; i ++) {
        pa[i] = i;
        sz[i] = 1;
    }
    while (!store.empty()) store.pop();
}

int find_anc(int x) {
    return pa[x] == x ? x : find_anc(pa[x]);
}

int mrg(int a, int b) {
    a = find_anc(a);
    b = find_anc(b);
    if (a == b) return 0;
    if (sz[a] > sz[b]) swap(a, b);
    pa[a] = b;
    sz[b] += sz[a];
    store.push({a, b});
    return 1;
}

void roll_back() {
    if (store.empty()) return;
    auto [a, b] = store.top();
    store.pop();

    pa[a] = a;
    sz[b] -= sz[a];
}

void prep() {
    cin >> n >> m;
    sq = min((int) 500, n);
    vector<int> V;
    for (int i = 1; i <= m; i ++) {
        cin >> u[i] >> v[i] >> d[i];
        V.push_back(d[i]);
    }
    cin >> q;
    for (int i = 1; i <= q; i ++) {
        cin >> t[i] >> pos[i] >> w[i];
        V.push_back(w[i]);
    }
    sort(V.begin(), V.end());
    map<int, int> mp;
    mp[V[0]] = 1;
    for (int i = 1; i < V.size(); i ++) {
        if (V[i] > V[i - 1]) mp[V[i]] = mp[V[i - 1]] + 1;
        k = max(k, mp[V[i]]);
    }

    for (int i = 1; i <= m; i ++) cur_d[i] = d[i] = mp[d[i]];
    for (int i = 1; i <= q; i ++) w[i] = mp[w[i]];

    //for (int i = 1; i <= m; i ++) cout << d[i] << "\n";
    //for (int i = 1; i <= q; i ++) cout << w[i] << "\n";
}

bool cmp_query(int i, int j) {
    return w[i] > w[j];
}

void solve() {
    vector<int> E[k + 1];
    vector<bool> unchange(m + 1, true);
    vector<int> change;
    int cur = 1;
    while (cur <= q) {
        for (int i = 1; i <= m; i ++) {
            E[d[i]].push_back(i);
        }

        vector<int> query;
        vector<int> update;
        for (int i = cur; i <= min(cur + sq - 1, q); i ++) {
            if (t[i] == 1) {
                update.push_back(i);
                unchange[pos[i]] = false;
                change.push_back(pos[i]);
            } else {
                query.push_back(i);
            }
        }

        reset_dsu();
        sort(query.begin(), query.end(), cmp_query);
        int cur_w = k;

        for (int x : query) {

            //cout << store.size() << "\n";

            while (cur_w >= w[x]) {
                for (int i : E[cur_w]) if (unchange[i]) {
                    mrg(u[i], v[i]);
                }
                cur_w --;
            }

            for (int i : update) {
                if (i > x) break;
                cur_d[pos[i]] = w[i];
            }

            int cnt = 0;
            for (int i : change) {
                if (cur_d[i] >= w[x]) cnt += mrg(u[i], v[i]);
            }

            ans[x] = sz[find_anc(pos[x])];

            while (cnt > 0) {
                roll_back();
                cnt --;
            }

            //cout << cnt << "\n\n";

            for (int i : update) {
                if (i > x) break;
                cur_d[pos[i]] = d[pos[i]];
            }
        }


        for (int i : update) {
            d[pos[i]] = cur_d[pos[i]] = w[i];
        }

        cur += sq;

        for (int i : change) unchange[i] = true;
        change.clear();
        for (int i = 1; i <= k; i ++) E[i].clear();
    }
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    prep();
    solve();
    for (int i = 1; i <= q; i ++) {
        if (ans[i] > 0) cout << ans[i] << "\n";
    }

    return 0;
}








#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...