Submission #839312

#TimeUsernameProblemLanguageResultExecution timeMemory
839312Dec0DeddBridges (APIO19_bridges)C++14
100 / 100
1702 ms10052 KiB
#include <bits/stdc++.h>

using namespace std;

#pragma GCC optimize("O3")

const int N = 1e5+10;
const int S = 2e3;

struct dsu {
    struct save {
        int v, u, szv, szu;
        save() {};
        save(int _v, int _u, int _szv, int _szu) : v(_v), u(_u), szv(_szv), szu(_szu) {}
    };

    vector<int> p, sz;
    vector<save> op;

    void init(int n) {
        p.resize(n+1), sz.resize(n+1);
        for (int i=0; i<=n; ++i) p[i]=i, sz[i]=1;
    }

    int f(int x) {
        while (p[x] != x) x=p[x];
        return x;
    }

    bool mrg(int v, int u) {
        v=f(v), u=f(u);
        if (v == u) return false;
        if (sz[u] > sz[v]) swap(v, u);
        op.push_back(save(v, u, sz[v], sz[u]));
        sz[v]+=sz[u]; p[u]=v;
        return true;
    }

    void roll() {
        if (op.empty()) return;
        save x=op.back(); op.pop_back();
        p[x.v]=x.v, p[x.u]=x.u;
        sz[x.v]=x.szv, sz[x.u]=x.szu;
    }
};

int n, m, q, a[N], b[N], w[N], tpw[N], t[N], x[N], y[N], ans[N], qs[N], chv[N], unchv[N];
bool us[N], chg[N];

void fs(int &number) {
    register int c;
    number = 0;

    c = getchar();
    for (; (c>47 && c<58); c=getchar()) number = number*10+c-48;
}

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

bool cmpq(int i, int j) {
    return y[i] > y[j];
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);

    fs(n), fs(m);
    for (int i=1; i<=m; ++i) fs(a[i]), fs(b[i]), fs(w[i]);

    fs(q);
    for (int i=1; i<=q; ++i) fs(t[i]), fs(x[i]), fs(y[i]);

    for (int l=1; l<=q; l+=S) {
        int r=min(q, l+S-1);

        int qsz=0, chsz=0, unchsz=0;
        for (int i=l; i<=r; ++i) {
            if (t[i] == 1) chg[x[i]]=true;
            else qs[qsz++]=i;
        } sort(qs, qs+qsz, cmpq);

        for (int i=1; i<=m; ++i) {
            tpw[i]=w[i];
            if (chg[i]) chv[chsz++]=i;
            else unchv[unchsz++]=i;
        } sort(unchv, unchv+unchsz, cmpw);

        dsu d; d.init(n+1);

        int p=0;
        for (int h=0; h<qsz; ++h) {
            int u=qs[h];
            int wu=y[u]; assert(t[u] == 2);

            while (p < unchsz) {
                if (wu <= w[unchv[p]]) {
                    d.mrg(a[unchv[p]], b[unchv[p]]), ++p;
                } else break;
            }

            for (int i=l; i<u; ++i) {
                if (t[i] == 2) continue;
                tpw[x[i]]=y[i];
            }

            int cnt=0;
            for (int j=0; j<chsz; ++j) {
                int g=chv[j];
                if (tpw[g] >= wu) cnt+=d.mrg(a[g], b[g]);
                tpw[g]=w[g];
            } ans[u]=d.sz[d.f(x[u])];

            while (cnt--) d.roll();
        }

        for (int i=l; i<=r; ++i) {
            if (t[i] == 2) continue;
            w[x[i]]=y[i], chg[x[i]]=false; 
        }
    }

    for (int i=1; i<=q; ++i) {
        if (t[i] == 2) printf("%d\n", ans[i]);
    }
}
#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...