Submission #862578

#TimeUsernameProblemLanguageResultExecution timeMemory
862578mraronBridges (APIO19_bridges)C++14
14 / 100
2506 ms38288 KiB
#include<bits/stdc++.h>
using namespace std;

struct edge {
    int a,b,c;
    int ind;
} edgs[100001];

struct query {
    int typ;
    int x,y;
} qs[100010];


int sz[100010], par[100010];
vector<int> adj[100010];

int volt[100010], cur=0;

void dfs(int x, int& ans) {
    volt[x]=cur;
    ans+=sz[x];
    while(!adj[x].empty()) {
        int i=adj[x].back();
        adj[x].pop_back();
        
        if(volt[i]<cur) {
            dfs(i, ans);
        }
    }
}

int n,m;
void init() {
    fill(sz+1, sz+n+1, 1);
    fill(par+1, par+n+1, -1);
}

int get(int x) {
    if(par[x]==-1) return x;
    return par[x]=get(par[x]);
}

void merge(int x, int y) {
    int px=get(x), py=get(y);
    if(px!=py) {
        par[px]=py;
        sz[py]+=sz[px];
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    cin>>n>>m;
    for(int i=0;i<m;++i) {
        cin>>edgs[i].a>>edgs[i].b>>edgs[i].c;
        edgs[i].ind=i;
    }
    
    int q;
    cin>>q;
    for(int i=0;i<q;++i) {
        cin>>qs[i].typ>>qs[i].x>>qs[i].y;
        if(qs[i].typ==1) qs[i].x--;
    }
    
    vector<int> results(q);

    const int blksz=500;
    for(int L=0;;L+=blksz) {
        int R=min(q-1, L+blksz-1);
        if(L>=q) break ;
        vector<bool> changedHere(m);
        vector<int> asked, bridges;
        for(int i=L;i<=R;++i) {
            if(qs[i].typ==1) changedHere[qs[i].x]=true;
            else asked.push_back(i);
        }
        
        for(int i=0;i<m;++i) {
            if(!changedHere[i]) {
                bridges.push_back(i);
            }
        }
        
        sort(asked.begin(), asked.end(), [&](int x, int y) -> bool {
            return qs[x].y>qs[y].y;
        });
        sort(bridges.begin(), bridges.end(), [&](int x, int y) -> bool {
            return edgs[x].c>edgs[y].c;
        });
        
        int ind=0;
        vector<int> last(m, -1);
        init();
        for(int i=0;i<(int)asked.size();++i) {
            while(ind<(int)bridges.size() && edgs[bridges[ind]].c>=qs[asked[i]].y) {
                merge(edgs[bridges[ind]].a, edgs[bridges[ind]].b);
                ind++;
            }
            for(int j=asked[i];j>=L;--j) {
                if(qs[j].typ==1) {
                    if(last[qs[j].x]!=i && qs[j].y>=qs[asked[i]].y) {
                        //~ cerr<<asked[i]<<" "<<j<<"firstcase\n";
                        int a=get(edgs[qs[j].x].a), b=get(edgs[qs[j].x].b);
                        if(a!=b) {
                            adj[a].push_back(b);
                            adj[b].push_back(a);
                        }
                    }
                    last[qs[j].x]=i;
                }
            }
            for(int j=asked[i]+1;j<=R;++j) {
                if(qs[j].typ==1 && last[qs[j].x]!=i) {                    
                    if(edgs[qs[j].x].c>=qs[asked[i]].y) {
                        int a=get(edgs[qs[j].x].a), b=get(edgs[qs[j].x].b);
                        if(a!=b) {
                            adj[a].push_back(b);
                            adj[b].push_back(a);
                        }
                    }
                    last[qs[j].x]=i;
                }
            }
            
            cur++;
            //~ cerr<<"NEED: "<<get(qs[asked[i]].x)<<" "<<asked[i]<<"\n";
            dfs(get(qs[asked[i]].x), results[asked[i]]);
        }
        
        for(int i=1;i<=n;++i) {
            adj[i].clear();
        }
        
        for(int i=L;i<=R;++i) {
            if(qs[i].typ==1) edgs[qs[i].x].c=qs[i].y;
        }
    }
    
    for(int i=0;i<q;++i) if(qs[i].typ==2) cout<<results[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...