Submission #1186781

#TimeUsernameProblemLanguageResultExecution timeMemory
1186781irmuunBridges (APIO19_bridges)C++20
59 / 100
3091 ms5948 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
#define ff first
#define ss second
#define all(s) s.begin(),s.end()
#define rall(s) s.rbegin(),s.rend()

const int N=5e4+5,M=1e5+5,Q=1e5+5;

int n,m,q;
vector<int>g[N];
int u[M],v[M],w[M];
int t[Q],x[Q],y[Q];

int sz[N],par[N];
vector<int>st;

void init(){
    fill(sz,sz+n,1);
    iota(par,par+n,0);
    st.clear();
}

int find(int x){
    while(x!=par[x]) x=par[x]; //atmost logN times
    return x;
}

void merge(int x,int y){
    x=find(x);
    y=find(y);
    if(x==y) return;
    if(sz[x]<sz[y]) swap(x,y);
    par[y]=x;
    sz[x]+=sz[y];
    st.pb(y);
}

void roll_back(int rem){
    while(st.size()>rem){
        int y=st.back();
        int x=par[y];
        sz[x]-=sz[y];
        par[y]=y;
        st.pop_back();
    }
}

int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin>>n>>m;
    for(int i=0;i<m;i++){
        cin>>u[i]>>v[i]>>w[i];
        u[i]--,v[i]--;
    }
    cin>>q;
    for(int i=0;i<q;i++){
        cin>>t[i]>>x[i]>>y[i];
        x[i]--;
    }
    int B=sqrtl(q);
    bool changed[m];
    vector<int>join[B];
    int ans[Q];
    for(int l=0;l<q;l+=B){
        init();
        int r=min(q,l+B);
        fill(changed,changed+m,false);
        vector<int>ask,upd;
        for(int i=l;i<r;i++){
            if(t[i]==1){
                changed[x[i]]=true;
            }
            else{
                ask.pb(i);
            }
        }
        vector<int>edge,left;
        for(int i=0;i<m;i++){
            if(changed[i]==true){
                upd.pb(i);
            }
            else{
                edge.pb(i);
            }
        }
        for(int i=l;i<r;i++){
            if(t[i]==1){
                w[x[i]]=y[i];
            }
            else{
                join[i-l].clear();
                for(int j:upd){
                    if(w[j]>=y[i]){
                        join[i-l].pb(j);
                    }
                }
            }
        }
        sort(all(edge),
            [&](int i,int j){
                return w[i]>w[j];
            }
        );
        sort(all(ask),
            [&](int i,int j){
                return y[i]>y[j];
            }
        );
        int j=0;
        for(int i:ask){
            while(j<edge.size()&&w[edge[j]]>=y[i]){
                merge(u[edge[j]],v[edge[j]]);
                j++;
            }
            int rem=st.size();
            for(int e:join[i-l]){
                merge(u[e],v[e]);
            }
            ans[i]=sz[find(x[i])];
            roll_back(rem);
        }
    }
    for(int i=0;i<Q;i++){
        if(t[i]==2){
            cout<<ans[i]<<"\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...