Submission #1349178

#TimeUsernameProblemLanguageResultExecution timeMemory
1349178vneduJoker (BOI20_joker)C++17
0 / 100
99 ms5740 KiB
#include<bits/stdc++.h>
using namespace std;
#define rep(i,x,y) for(int i=(x);i<=(y);++i)
template<class T> bool maximize(T &a, const T &b){ return (a < b) ? a = b, 1 : 0; }
template<class T> bool minimize(T &a, const T &b){ return (a > b) ? a = b, 1 : 0; }
typedef long long ll;
#define all(x) x.begin(),x.end()
#define ii pair<int,int>
#define fi first
#define se second
#define pb push_back
/// end of template ///

const int N = 2e5 + 5;
const int M = 2e5 + 5;
const int Q = 2e5 + 5;
int n,m,q,U[M],V[M],f[M];
struct Dsu
{
    int n,par[N],sz[N];
    bool ok,xr[N];
    stack<int> history;
    Dsu() {}
    void init(int _n)
    {
        n=_n;
        for(int i=1;i<=n;++i) par[i]=i,xr[i]=0,sz[i]=1;
        ok=1;
    }
    ii get(int x)
    {
        if(x==par[x]) return {x,0};
        ii cm=get(par[x]);
        return {cm.fi,cm.se^xr[x]};
    }
    bool unite(int u, int v)
    {
        ii s=get(u),t=get(v);
        if(s.fi==t.fi)
        {
            history.push(~ok);
            if(s.se==t.se) ok=0;
            return 0;
        }
        if(sz[t.fi]>sz[s.fi]) swap(s,t);
        xr[t.fi]=(s.se^1^t.se);
        par[t.fi]=s.fi;
        sz[s.fi]+=sz[t.fi];
        history.push(t.fi);
        return 1;
    }
    void rollback(int rb)
    {
        while((int)history.size()>rb)
        {
            int x=history.top();
            history.pop();
            if(x<0) ok=(~x);
            else sz[par[x]]-=sz[x],par[x]=x,xr[x]=0;
        }
    }
    void addEdge(int e)
    {
        if(e==0 || e==m+1) return;
        unite(U[e],V[e]);
    }
    int snap()
    {
        return (int)history.size();
    }
} dsu;
void dnc(int l, int r, int lo, int hi)
{
    if(l>r) return;
//    cout<<l<<' '<<r<<' '<<lo<<' '<<hi<<'\n';
//    cout<<dsu.ok<<'\n';
    int mid((l+r)>>1);
    int c0=dsu.snap();
    rep(i,mid+1,r) dsu.addEdge(i);
    int c1=dsu.snap();
    f[mid]=lo-1;
    do
    {
        ++f[mid];
        if(f[mid]==mid+1) break;
        dsu.addEdge(f[mid]);
    } while(dsu.ok);
//    cout<<mid<<' '<<f[mid]<<'\n';
//    exit(0);
    dsu.rollback(c1);
    dnc(l,mid-1,lo,f[mid]);
    dsu.rollback(c0);
    rep(i,lo,f[mid]-1) dsu.addEdge(i);
    dnc(mid+1,r,f[mid],hi);
    dsu.rollback(c0);
}
void solve()
{
    cin>>n>>m>>q;
    rep(i,1,m) cin>>U[i]>>V[i];
    dsu.init(n);
    dnc(1,m,0,m+1);
    while(q--)
    {
        int l,r;
        cin>>l>>r;
        cout<<(l>=f[r]?"YES\n":"NO\n");
    }
}
int main()  {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    #define TASK "OLP304"
//    freopen(TASK".inp","r",stdin);
//    freopen(TASK".out","w",stdout);

    int testcase=1;
//    cin>>testcase;

    while (testcase--)
        solve();

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