Submission #1183651

#TimeUsernameProblemLanguageResultExecution timeMemory
1183651ttamxJoker (BOI20_joker)C++20
0 / 100
2091 ms6080 KiB
#include<bits/stdc++.h>

using namespace std;

const int N=200005;

int n,m,q;
int eu[N],ev[N],opt[N];

struct DSU{
    int p[N],sz[N],c[N];
    bool ans;
    int t;
    vector<tuple<int,int,int,bool>> s;
    void init(){
        for(int i=1;i<=n;i++)p[i]=i,sz[i]=1,c[i]=0;
        ans=true;
        t=0;
        s.clear();
    }
    int fp(int u){return u==p[u]?u:fp(p[u]);}
    int col(int u){return c[u]^(u==p[u]?0:col(p[u]));}
    int uni(int i){
        t++;
        int u=eu[i],v=ev[i];
        int cu=col(u),cv=col(v);
        u=fp(u),v=fp(v);
        if(u==v){
            if(cu==cv){
                s.emplace_back(t,0,0,ans);
                ans=false;
            }
        }else{
            if(sz[u]>sz[v])swap(u,v);
            if(cu==cv)c[v]^=1;
            sz[u]+=sz[v];
            p[v]=u;
            s.emplace_back(t,u,v,ans);
        }
        return t;
    }
    void rollback(int x){
        t=x;
        while(!s.empty()){
            auto [tt,u,v,a]=s.back();
            if(tt<=t)break;
            if(u){
                sz[u]-=sz[v];
                p[v]=v;
            }
            ans=a;
            s.pop_back();
        }
    }
}dsu;

void dnc(int l,int r,int optl,int optr){
    if(l>r)return;
    int m=(l+r)/2;
    opt[m]=optr;
    int t1=dsu.t;
    for(int i=l;i<m;i++)dsu.uni(i);
    int t2=dsu.t;
    while(dsu.ans&&opt[m]>=m)dsu.uni(opt[m]--);
    dsu.rollback(t2);
    dsu.uni(m);
    dnc(m+1,r,opt[m],optr);
    dsu.rollback(t1);
    dnc(l,m-1,optl,opt[m]);
}

int main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cin >> n >> m >> q;
    for(int i=1;i<=m;i++)cin >> eu[i] >> ev[i];
    dsu.init();
    dnc(1,m,1,m);
    while(q--){
        int l,r;
        cin >> l >> r;
        cout << (opt[l]>=r?"YES":"NO") << "\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...