This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <cstdio>
#include <vector>
#include <algorithm>
#include <functional>
#include <stack>
using namespace std;
vector<int> u;
vector<int> s;
vector<int> p;
int find(int n) {
    if (u[n] == n) return n;
    return find(u[n]);
}
int parity(int n) {
    if (u[n] == n) return 0;
    return parity(u[n])^p[n];
}
struct UniteInfo {
    int a;
    int b;
    int sa;
};
UniteInfo unite(int a, int b) {
    int ap = find(a);
    int bp = find(b);
    if (s[bp] > s[ap]) {
        swap(a, b);
        swap(ap, bp);
    }
    u[bp] = ap;
    s[ap] += s[bp];
    if (parity(a) == parity(b)) {
        p[bp] = 1;
    } else {
        p[bp] = 0;
    }
    return UniteInfo {
        ap,
        bp,
        s[ap] - s[bp],
    };
}
void undo(UniteInfo info) {
    u[info.b] = info.b;
    s[info.a] = info.sa;
    p[info.b] = 0;
}
struct Query {
    int l;
    int r;
    int i;
};
bool comp_query(Query q1, Query q2) {
    return q1.r > q2.r;
}
int main() {
    int n, m, qn;
    scanf("%d %d %d", &n, &m, &qn);
    u.resize(n);
    s.resize(n, 1);
    p.resize(n);
    for (int i = 0; i < n; i++) {
        u[i] = i;
    }
    vector<pair<int, int>> e(m);
    for (int i = 0; i < m; i++) {
        int a, b; 
        scanf("%d %d", &a, &b);
        a--;b--;
        e[i] = make_pair(a, b);
        //printf("%d %d %d\n", a, b, i);
    }
    vector<Query> q(qn);
    for (int i = 0; i < qn; i++) {
        int l, r;
        scanf("%d %d", &l, &r);
        l--;r--;
        q[i] = Query{l,r,i};
    }
    sort(q.begin(), q.end(), comp_query);
    stack<UniteInfo> infos;
    vector<bool> result(qn);
    int current_r = m-1;
    bool r_cycle = false;
    for (int i = 0; i < qn; i++) {
        if (r_cycle) {
            result[q[i].i] = true;
            continue;
        }
        int l = q[i].l;
        int r = q[i].r;
        //printf("%d: %d %d\n", i, l, r);
        while (current_r > r) {
            int a = e[current_r].first;
            int b = e[current_r].second;
            //printf("%d %d %d\n", current_r, a, b);
            if (find(a) == find(b)) {
                if (parity(a) == parity(b)) {
                    r_cycle = true;
                    break;
                }
            } else {
                unite(a, b);
            }
            current_r--;
        }
        if (r_cycle) {
            result[q[i].i] = true;
            continue;
        }
        bool cycle = false;
        for (int current_l = 0; current_l < l; current_l++) {
            int a = e[current_l].first;
            int b = e[current_l].second;
            //printf("%d %d %d\n", current_l, a, b);
            if (find(a) == find(b)) {
                if (parity(a) == parity(b)) {
                    cycle = true;
                    break;
                }
            } else {
                infos.push(unite(a, b));
            }
        }
        if (cycle) {
            result[q[i].i] = true;
        }
        while (infos.size() > 0) {
            undo(infos.top());
            infos.pop();
        }
    }
    for (int i = 0; i < qn; i++) {
        if (result[i]) {
            printf("YES\n");
        } else {
            printf("NO\n");
        }
    }
}
Compilation message (stderr)
Joker.cpp: In function 'int main()':
Joker.cpp:67:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   67 |     scanf("%d %d %d", &n, &m, &qn);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
Joker.cpp:80:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   80 |         scanf("%d %d", &a, &b);
      |         ~~~~~^~~~~~~~~~~~~~~~~
Joker.cpp:89:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   89 |         scanf("%d %d", &l, &r);
      |         ~~~~~^~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |