제출 #1317537

#제출 시각아이디문제언어결과실행 시간메모리
1317537hoangmc2009다리 (APIO19_bridges)C++17
59 / 100
3093 ms6004 KiB
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
const int maxn=5e4+9,maxm=1e5+9,B=320;
int n,m,q,res[maxm];
array<int,3> E[maxm]; //u,v,w
array<int,3> Q[maxm]; //t,u,w
int dsu[maxn];
stack<pair<int,int>> snapshot;
int find_set(int u) {return dsu[u]<0?u:find_set(dsu[u]);}
void union_set(int u,int v)
{
    u=find_set(u); v=find_set(v);
    if(u!=v)
    {
        if(dsu[u]>dsu[v]) swap(u,v);
        snapshot.push({u,dsu[u]});
        snapshot.push({v,dsu[v]});
        dsu[u]+=dsu[v]; dsu[v]=u;
    }
}
void rollback(int timer)
{
    while(snapshot.size()>timer)
    {
        auto [u,v]=snapshot.top();
        dsu[u]=v; snapshot.pop();
    }
}
int mark[maxm];
vector<array<int,3>> jnL[B];
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin>>n>>m;
    fill(dsu+1,dsu+n+1,-1);
    for(int i=1;i<=m;++i) cin>>E[i][0]>>E[i][1]>>E[i][2];
    cin>>q;
    for(int i=0;i<q;++i) cin>>Q[i][0]>>Q[i][1]>>Q[i][2];
    for(int l=0;l<q;l+=B)
    {
        int r=min(q-1,l+B-1);
        rollback(0);
        fill(mark+1,mark+m+1,0);
        vector<int> t10,t2;
        for(int i=l;i<=r;++i)
        {
            jnL[i-l].clear();
            if(Q[i][0]==1) mark[Q[i][1]]=1;
            else t2.push_back(i);
        }
        for(int i=1;i<=m;++i) {if(!mark[i]) t10.push_back(i);}
        sort(t10.begin(),t10.end(),[&](int x,int y){return E[x][2]>E[y][2];});
        sort(t2.begin(),t2.end(),[&](int x,int y){return Q[x][2]>Q[y][2];});
        for(int i=l;i<=r;++i)
        {
            if(Q[i][0]==1) E[Q[i][1]][2]=Q[i][2];
            if(Q[i][0]==2)
            {
                for(int j=l;j<=r;++j)
                    if(Q[j][0]==1) jnL[i-l].push_back(E[Q[j][1]]);
            }
        }
        for(int i=0,j=0;j<t2.size();++j)
        {
            while(i<t10.size() and E[t10[i]][2]>=Q[t2[j]][2])
            {
                union_set(E[t10[i]][0],E[t10[i]][1]);
                ++i;
            }
            int tmp=snapshot.size();
            for(auto& [u,v,w]:jnL[t2[j]-l])
                if(w>=Q[t2[j]][2]) union_set(u,v);
            res[t2[j]]=-dsu[find_set(Q[t2[j]][1])];
            rollback(tmp);
        }
    }
    for(int i=0;i<q;++i) {if(Q[i][0]==2) cout<<res[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...