| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 1153489 | Robert_junior | Joker (BOI20_joker) | C++20 | 0 ms | 0 KiB | 
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin(), x.end()
#define ins insert
#define pb push_back
#define F first
#define S second
const int N = 4e5+100, M = 5e5 + 7;
const int mod = 998244353;
int opt[N], block[N], f[N], p[N], sz[N];
pair<int, int>g[N]; 
stack<pair<int, int>>s;
bool ok = 1;
pair<int, int>get(int v){
    if(p[v] == v) return {v, 0};
    pair<int, int>val = get(p[v]);
    return {val.F, (val.S + f[v]) % 2};
}
void unite(int i){
    int u = g[i].F, v = g[i].S;
    if(u == -1) return;
    pair<int, int>x = get(u), y = get(v);
    if(x.F == y.F){
        if(y.S == x.S){
            if(ok){
                ok = 0; 
                s.push({-1, -1});
            }
        }
        return;
    }
    if(sz[x.F] < sz[y.F]) swap(x, y);
    s.push({x.F, sz[x.F]});
    s.push({y.F, sz[y.F]});
    sz[x.F] += sz[y.F];
    p[y.F] = x.F;
    f[y.F] = (x.S + y.S + 1) % 2;
}
void otkat(){
    while(s.size() && block[s.size()] == 0){
        pair<int, int>x = s.top();
        s.pop();
        if(x.F == -1){
            ok = 1;
            continue;
        }
        p[x.F] = x.F;
        f[x.F] = 0;
        sz[x.F] = x.S;
    }
    block[s.size()]--;
}
void dnc(int l, int r, int optr){
    if(l > r) return;
    int m = (l + r) / 2;
    for(int i = l; i < m; i++){
        unite(i);
    }
    block[s.size()]++;
    for(int i = optr; i >= m; i--){
        unite(i);
        if(!ok){
            opt[m] = r;
            break;
        }
    }
    otkat();
    unite(m);
    dnc(m + 1, r, optr);
    otkat();
    if(!opt[m]) return;
    for(int i = optr; i > opt[m]; i--){
        unite(i);
    }
    dnc(l, m - 1, opt[m]);
    otkat();
}
void solve(){
    int n, m, q;
    cin>>n>>m>>q;
    for(int i = 1; i <= n; i++){
        p[i] = i;
        sz[i] = 1;
    }
    for(int i = 1; i <= m; i++){
        cin>>g[i].F>>g[i].S;
    }
    g[m + 1] = {-1, -1};
    dnc(1, m, m + 1);
    while(q--){
        int l, r;
        cin>>l>>r
        l = max(l, 1);
        r = min(r, m);
        if(opt[l] > r) cout<<"YES\n";
        else cout<<"NO\n";
    }
}
main(){
    ios_base :: sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    //cin>>t; 
    for(int i = 1; i <= t; i++){
        //cout<<"Case "<<i<<": ";
        solve();
    }
}
