Submission #784519

#TimeUsernameProblemLanguageResultExecution timeMemory
784519DenkataBridges (APIO19_bridges)C++17
14 / 100
1379 ms8544 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,new_w[maxn],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];
stack <int> st;
int Find(int p)
{
    if(par[p]==p)
        return p;
    return Find(par[p]);
}
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())
    {
        p = st.top();
        st.pop();
        sz[par[p]] -= sz[p];
        par[p] = p;
    }
}

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;
                new_w[p] = q;
               // 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);
        d = 0;
        for(i=1; i<=n; 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(auto j:changed)
                {
             //       cout<<j.second<<" "<<v[j.first].d<<endl;
                    if((new_w[j.first]>=i.second && j.second<i.ind) || (j.second>i.ind && v[j.first].d>=i.second))
                    {
                        Union(v[j.first].u,v[j.first].v,1);
                    }
                }
              //  cout<<i.ind<<" "<<sz[Find(i.first)]<<endl;
                ans[i.ind] = sz[Find(i.first)];
                roll_back();
            }
        }
        for(auto i:changed)
            v[i.first].d = new_w[i.first];
        a.clear();

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

    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...