Submission #1163002

#TimeUsernameProblemLanguageResultExecution timeMemory
1163002OtalpBridges (APIO19_bridges)C++17
100 / 100
2200 ms26276 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define pii pair<int, int>
#define ff first
#define ss second
#define unm unordered_map

const ll mod = 1e9 + 7;
const int MAXN = 2e5 + 5;
const int MAXA = 2e5 + 5;

vector<int> q[200100], dq[200100];
int fat = 350;
int us[200100], dus[200100], ans[200100];

struct DSU{
    int p[50100], sz[50100];
    void build(int n){
        for(int i=1; i<=n; i++){
            p[i] = i;
            sz[i] = 1;
        }
    }
    int get(int a){
        if(p[a] == a) return a;
        return p[a] = get(p[a]);
    }
    void un(int a, int b){
        a = get(a);
        b = get(b);
        if(a == b) return;
        if(sz[a] < sz[b]) swap(a, b);
        sz[a] += sz[b];
        p[b] = a;
    }
};

void solve(){
    int n, m;
    cin>>n>>m;
    set<pii> dq;
    for(int i=1; i<=m; i++){
        int l, r, x;
        cin>>l>>r>>x;
        x = -x;
        dq.insert({x, i});
        q[i] = {l, r, x};
    }
    vector<vector<int> > z;
    int t = 0;
    cin>>t;
    fat = sqrt(t);
    // fat = 1;
    for(int i=0; i<t; i++){
        int l, r, x;
        cin>>l>>r>>x;
        x = -x;
        z.pb({l, r, x});
    }
    DSU dds, ds;
    dds.build(n);
    for(int t=0; t<z.size(); t+=fat){
        int ngr = min((int)z.size(), t + fat);
        vector<vector<int>> h;
        vector<int> use;
        for(int i=t; i<ngr; i++){
            if(z[i][0] == 2){
                h.pb({z[i][2], z[i][1], i});
            }
            else{
                if(!us[z[i][1]])use.pb(z[i][1]);
                us[z[i][1]] = 1;
            }
        }
        sort(h.begin(), h.end());
        vector<int> d;
        for(auto it: dq){
            if(us[it.ss]) continue;
            d.pb(it.ss);
        }
        int ls=-1;
        ds.build(n);
        for(auto g: h){
            // cout<<g[0]<<' '<<g[1]<<' '<<g[2]<<'\n';
            while(ls + 1 < d.size() and q[d[ls + 1]][2] <= g[0]){
                ls++;
                // cout<<q[d[ls]][0]<<' '<<q[d[ls]][1]<<' '<<q[d[ls]][2]<<'\n';
                ds.un(q[d[ls]][0], q[d[ls]][1]);
            }
            vector<int> dd;
            for(int i=g[2]; i>=t; i--){
                if(z[i][0] == 2) continue;
                if(dus[z[i][1]]) continue;
                dus[z[i][1]] = 1;
                if(z[i][2] <= g[0]) dd.pb(z[i][1]);
            }
            for(int to: use){
                if(!dus[to] and q[to][2] <= g[0]) dd.pb(to);
            }
            int res = 0;
            int v = ds.get(g[1]);
            for(int x: dd){
                int l = ds.get(q[x][0]), r=ds.get(q[x][1]);
                dds.sz[l] = ds.sz[l];
                dds.sz[r] = ds.sz[r];
            }
            dds.sz[v] = ds.sz[v];
            for(int x: dd){
                int l = ds.get(q[x][0]), r=ds.get(q[x][1]);
                dds.un(l, r);
                // cout<<l<<' '<<r<<'\n';
            }
            res = dds.sz[dds.get(v)];
            ans[g[2]] = res;
            for(int x: dd){
                int l = ds.get(q[x][0]), r=ds.get(q[x][1]);
                dds.sz[l] = 1;
                dds.p[l] = l;
                dds.sz[r] = 1;
                dds.p[r] = r;
            }
            dds.sz[v] = 1;
            dds.p[v] = v;
            for(int i=g[2]; i>=t; i--){
                dus[z[i][1]] = 0;
            }
        }
        for(int i=t; i<ngr; i++){
            if(z[i][0] == 2) continue;
            int l = z[i][1], x = z[i][2];
            us[z[i][1]] = 0;
            dq.erase({q[l][2], l});
            q[l][2] = x;
            dq.insert({x, l});
        }
    }
    for(int i=0; i<z.size(); i++){
        if(z[i][0] == 2){
            cout<<ans[i]<<'\n';
        }
    }
}

int main(){
    ios_base::sync_with_stdio(NULL);cin.tie(NULL);cout.tie(NULL);
    int t=1;
    //cin>>t;
    while(t--){
        solve();
        cout<<'\n';
    }
}
#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...