Submission #784612

#TimeUsernameProblemLanguageResultExecution timeMemory
784612DenkataBridges (APIO19_bridges)C++17
100 / 100
1806 ms11904 KiB
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int crit = 1000;
const int maxn = 1e6+3;
int i,j,p,q,n,m,k,Q,br,d,ans[maxn+3];
int used[maxn];
struct Query
{
    int type;
    int first,second;
    int ind;
};
struct Edge
{
    int u,v,d;
};
vector <pair<int,int>> changed;
vector <Edge> v;
vector <Query> a,b;
bool fff(Query a,Query b)
{
    if(a.second!=b.second) return a.second>b.second;
    return a.type>b.type;
}
int par[maxn],sz[maxn];

int Find(int p)
{
    if(par[p]==p)
        return p;
    return Find(par[p]);
}

stack <int> st,st2;
void Union(int p,int q,bool fl)
{
    p = Find(p);
    q = Find(q);

  //  cout<<p<<"  Union "<<q<<endl;
    if(p==q)return ;

    if(sz[p]>sz[q])swap(p,q);

    if(fl)
        st.push(p);

    par[p] = q;
    sz[q] += sz[p];

}
void roll_back()
{
    while(!st.empty())
    {
        int t = st.top();
        st.pop();
        sz[par[t]]-=sz[t];
        par[t] = t;
    }
    while(!st2.empty())
    {
        p = st2.top();
        st2.pop();
        used[p] = 0;
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin>>n>>m;
    v.push_back({0,0,0});///parser
    for(i=1; i<=m; i++)
    {
        cin>>p>>q>>k;
        v.push_back({p,q,k});
    }
    cin>>Q;
    for(i=1; i<=Q; i++)
    {
        cin>>p>>q>>k;
        b.push_back({p,q,k});
    }
    for(int ii=0; ii<Q; ii+=crit)
    {
        //cout<<ii<<" query "<<endl;
        int R = min(ii+crit-1,Q-1);
        for(int jj=ii; jj<=R; jj++)
            a.push_back({b[jj].type,b[jj].first,b[jj].second,jj});

        ++br;
        vector <Query> tek;
        changed.clear();
        tek.clear();

        for(auto i:a)
        {
            if(i.type==1)
            {
                p = i.first;
                q = i.second;
               // cout<<p<<" changed "<<endl;
                changed.push_back({p,i.ind});
                used[p] = br;
            }
            else tek.push_back({-1,i.first,i.second,i.ind});
        }
        for(i=1; i<=m; i++)
        {
            if(used[i]!=br)
            {
              //  cout<<v[i].u<<" rebra "<<v[i].v<<" "<<v[i].d<<endl;
                tek.push_back({v[i].u,v[i].v,v[i].d});
            }
        }
        sort(tek.begin(),tek.end(),fff);
        for(i=0; i<=n+1; i++)
            par[i] = i,sz[i] = 1;
        for(auto i:tek)
        {
            if(i.type!=-1)
            {
                p = i.type;
                q = i.first;
         //      cout<<p<<" dobavqne "<<q<<endl;
                Union(p,q,0);
            }
            else
            {
                for(j=i.ind-1;j>=ii;j--)
                {
                    if(b[j].type==1 && used[b[j].first]!=-1)
                    {
                     //   cout<<"rebro predi query "<<b[j].first<<endl;
                        used[b[j].first] = -1;
                        st2.push(b[j].first);
                        if(b[j].second>=i.second)
                            Union(v[b[j].first].u,v[b[j].first].v,1);
                    }
                }
                for(j=i.ind+1;j<=R;j++)
                {

                    if(b[j].type==1 && used[b[j].first]!=-1)
                    {

                //        cout<<"rebro sled query "<<b[j].first<<endl;
                        if(v[b[j].first].d>=i.second)
                            Union(v[b[j].first].u,v[b[j].first].v,1);
                    }
                }
             //   cout<<i.first<<" "<<Find(i.first)<<" "<<sz[1]<<endl;
                ans[i.ind] = sz[Find(i.first)];
                roll_back();
            }
        }
        for(auto i:a)
            if(i.type==1)v[i.first].d = i.second;
        a.clear();

    }
    for(i=0;i<Q;i++)
    {
        if(b[i].type==2)
            cout<<ans[i]<<endl;
    }

    return 0;
}
///if an edge is updated more than once during the same bucket query processing!
///there is difference if an edge is updated before a query and after a query
#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...