func_code_string: #include <bits/stdc++.h>   int n, m, q;   std::vector<int> dp;   std::vector<std::pair<int, int> > edges;   struct bip {     std::vector<int> pers;     std::stack<std::pair<int, int> > updates;     std::stack<int> change;     void update(int i, int j) {       updates.push({i, pers[i]});       pers[i] = j;     }     int root(int u) {       while (pers[(u + 1)] >= 0) u = pers[(u + 1)];       return u;     }     void merge(int u, int v) {       if (!pers[(0)]) {         change.push(0);         return;       }       u = root(u);       v = root(v);       if (pers[(n + 1 + u)] == v) {         change.push(0);         return;       }       if (u == v) {         update((0), 0);         change.push(1);         return;       }       int c = 0;       int eu = pers[(n + 1 + u)];       int ev = pers[(n + 1 + v)];       if (ev != -1) {         if (pers[(ev + 1)] < pers[(u + 1)]) u ^= ev ^= u ^= ev;         update((u + 1), pers[(ev + 1)] + pers[(u + 1)]);         c++;         update((ev + 1), u);         c++;       }       if (eu != -1) {         if (pers[(eu + 1)] < pers[(v + 1)]) v ^= eu ^= v ^= eu;         update((v + 1), pers[(eu + 1)] + pers[(v + 1)]);         c++;         update((eu + 1), v);         c++;       }       update((n + 1 + u), v);       c++;       update((n + 1 + v), u);       c++;       change.push(c);     }     void undo() {       int u = change.top();       change.pop();       while (u--) {         std::pair<int, int> next = updates.top();         updates.pop();         pers[next.first] = next.second;       }     }   } graph;   void solve(int l, int r, int tl, int tr) {     int mid = (l + r) / 2;     for (int i = l; i < mid; i++) {       graph.merge(edges[i].first, edges[i].second);     }     int opt = tr;     for (int i = tr; i > std::max(tl, mid); i--) {       graph.merge(edges[i].first, edges[i].second);       if (graph.pers[(0)]) opt = i - 1;     }     dp[mid] = opt;     for (int i = tr; i > std::max(tl, mid); i--) graph.undo();     dp[mid] = opt;     if (l == r) {       for (int i = l; i < mid; i++) graph.undo();       return;     }     graph.merge(edges[mid].first, edges[mid].second);     solve(mid + 1, r, opt, tr);     for (int i = mid; i >= l; i--) graph.undo();     if (l < mid) {       for (int i = tr; i > opt; i--) graph.merge(edges[i].first, edges[i].second);       solve(l, mid - 1, tl, opt);       for (int i = opt + 1; i <= tr; i++) graph.undo();     }   }   signed main() {     std::ios::sync_with_stdio(false);     std::cin.tie(0);     std::cin >> n >> m >> q;     graph.pers = std::vector<int>(2 * n + 1, -1);     graph.pers[(0)] = 1;     edges.resize(m);     int last = 0;     for (int i = 0; i < m; i++) {       std::cin >> edges[i].first >> edges[i].second;       edges[i].first--;       edges[i].second--;       if (graph.pers[(0)]) last = i;       graph.merge(edges[i].first, edges[i].second);     }     dp.resize(last + 1);     for (int i = 0; i < m; i++) graph.undo();     solve(0, last, 0, m - 1);     while (q--) {       int l, r;       std::cin >> l >> r;       l--;       r--;       if (l > last || r < dp[l])         std::cout <<  YES  << std::endl;       else         std::cout <<  NO  << std::endl;     }     return 0;   }   