#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;
}
