Submission #1263452

#TimeUsernameProblemLanguageResultExecution timeMemory
1263452kokoueBridges (APIO19_bridges)C++20
13 / 100
2265 ms125212 KiB
#include<bits/stdc++.h>
#define ll long long
#define f first
#define s second
using namespace std;
const int maxn =5e4+5;
const int B=500;
int n,m,q;
struct Edge
{
    ll u,v,w;
};
struct Query
{
    int t,a,b,idx;
};
bool cmp(Edge e1,Edge e2)
{
    return e1.w<e2.w;
}
vector<Edge> edges;
vector<Query> qs;
int parent[maxn];
int sz[maxn];
int ans[maxn];
struct DSUret
{
    int paridx,szidx,szval;
};
stack<DSUret> st;
int findd(int u)
{
    if(parent[u]==0) return u;
    return findd(parent[u]);
}
bool unite(int uu,int vv)
{
    uu=findd(uu);
    vv=findd(vv);
    if(uu==vv) return 0;
    if(sz[uu]<sz[vv]) swap(uu,vv);
    st.push({vv,uu,sz[uu]});
    parent[vv]=uu;
    sz[uu]+=sz[vv];
    return 1;
}
void DoBlock(int l,int r)
{
    vector<int> forrem;
    vector<int> ups;
    vector<bool> is(m,0);
    vector<pair<int,int>> forsort;
    vector<bool> used(m,0);
    for(int i=l;i<=r;i++)
    {
        if(qs[i].t==1) ///update
        {
            is[qs[i].a]=1;
            ups.push_back(i);
        }
        if(qs[i].t==2) ///query
        {
            forsort.push_back({qs[i].b,-i});
        }
    }
    for(int i=0;i<m;i++)
    {
        if(!is[i]) forsort.push_back({edges[i].w,i+1});
    }
    sort(forsort.rbegin(),forsort.rend());
    for(auto e:forsort)
    {

        if(e.s>0)
        {
            unite(edges[e.s-1].u,edges[e.s-1].v);
            //printf("united edge %d %d weight %d\n",edges[e.s-1].u,edges[e.s-1].v,edges[e.s-1].w);
            continue;
        }
        int cntr=0;
        for(int i=ups.size()-1;i>=0;i--)
        {
            if(used[qs[ups[i]].a]) continue;

            if(qs[ups[i]].idx<(-e.s))
            {
                used[qs[ups[i]].a]=1;
                if(qs[ups[i]].b>=e.f)
                {
                    //printf("1united edge %d\n",qs[ups[i]].a);
                    cntr+=unite(edges[qs[ups[i]].a].u,edges[qs[ups[i]].a].v);
                }
                continue;
            }
        }
        for(int i=ups.size()-1;i>=0;i--)
        {
            if(used[qs[ups[i]].a]) continue;
            if(edges[qs[ups[i]].a].w>=e.f)
            {
                //printf("2united edge %d\n",qs[ups[i]].a);
                cntr+=unite(edges[qs[ups[i]].a].u,edges[qs[ups[i]].a].v);
            }
        }
        //printf("did query %d for %d with cntr %d and ans %d\n",(-e.s),qs[-e.s].a,cntr,sz[findd(qs[-e.s].a)]);
        ans[-e.s]=sz[findd(qs[-e.s].a)];
        /*printf("before retrive: ");
        for(int i=1;i<=n;i++)
        {
            printf("{%d , %d} ",parent[i],sz[i]);
        }
        printf("\n");*/
        //memset(used,0,sizeof used);
        //for(int i=0;i<m;i++) used[i]=0;
        while(cntr && !st.empty())
        {
            cntr--;
            parent[st.top().paridx]=0;
            sz[st.top().szidx]=st.top().szval;
            //used[st.top().edgeid]=0;
            st.pop();
        }
        for(int i=0;i<ups.size();i++) used[qs[ups[i]].a]=0;
        /*printf("after retrive: ");
        for(int i=1;i<=n;i++)
        {
            printf("{%d , %d} ",parent[i],sz[i]);
        }
        printf("\n");*/
    }
    for(auto e:ups)
    {
        edges[qs[e].a].w=qs[e].b;
    }
    for(int i=1;i<=n;i++)
    {
        parent[i]=0;
        sz[i]=1;
    }
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        parent[i]=0;
        sz[i]=1;
    }
    for(int i=0;i<m;i++)
    {
        int uu,vv,ww;
        cin>>uu>>vv>>ww;
        edges.push_back({uu,vv,ww});
    }
    cin>>q;
    for(int i=0;i<q;i++)
    {
        int tt,aa,bb;
        cin>>tt>>aa>>bb;
        if(tt==1) aa--;
        qs.push_back({tt,aa,bb,i});
    }
    for(int i=0;i<q;i++)
    {
        DoBlock(i,min(i+B,q-1));
        i=min(i+B,q-1);
    }
    for(int i=0;i<q;i++)
    {
        if(qs[i].t==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...