#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 7;
struct DSU {
  int rep[N], sz[N], dist[N];
  vector<int> ops;
  void init() {
    for (int i = 0; i < N; i++) rep[i] = i, sz[i] = 1, dist[i] = 0;
    ops.clear();
  }
  pair<int, int> find(int u) {
    int col = 0;
    while (rep[u] != u) col ^= dist[u], u = rep[u];
    return {u, col};
  }
  bool merge(int u, int v) {
    auto pru = find(u), prv = find(v);
    int ru = pru.first, rv = prv.first;
    int cu = pru.second, cv = prv.second;
    if (ru != rv) {
      if (sz[ru] < sz[rv]) swap(ru, rv);
      rep[rv] = ru;
      dist[rv] = cu ^ cv ^ 1;
      sz[ru] += sz[rv];
      ops.push_back(rv);
      return true;
    } else {
      if (cu == cv) return false;
      ops.push_back(-1);
      return true;
    }
  }
  void undo() {
    int u = ops.back();
    ops.pop_back();
    if (u == -1) return;
    sz[rep[u]] -= sz[u];
    rep[u] = u;
    dist[u] = 0;
  }
} dsu;
struct Update {
  int type, u, v;
};
struct QueueUndoTrick {
  vector<Update> updates;
  int cnt0 = 0;
  QueueUndoTrick() { dsu.init(); }
  bool pushUpdate(const Update &up) {
    bool b = dsu.merge(up.u, up.v);
    if (!b) return false;
    updates.push_back(up);
    if (up.type == 0) cnt0++;
    return true;
  }
  void popUpdate() {
    if (updates.back().type == 0) cnt0--;
    updates.pop_back();
    dsu.undo();
  }
  bool update(int u, int v) { return pushUpdate({1, u, v}); }
  void undoFront() {
    if (cnt0 == 0) {
      vector<Update> temp;
      for (Update &up : updates) temp.push_back(up), popUpdate();
      reverse(temp.begin(), temp.end());
      for (Update &up : temp) up.type = 0, pushUpdate(up);
    }
    if (updates.back().type == 1) {
      vector<Update> temp[2];
      do {
        temp[updates.back().type].push_back(updates.back());
        popUpdate();
      } while (cnt0 > 0 && temp[0].size() != temp[1].size());
      reverse(temp[0].begin(), temp[0].end());
      reverse(temp[1].begin(), temp[1].end());
      for (Update up : temp[1]) pushUpdate(up);
      for (Update up : temp[0]) pushUpdate(up);
    }
    assert(updates.back().type == 0);
    popUpdate();
  }
};
int u[N], v[N];
int pre[N];
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, m, q;
  cin >> n >> m >> q;
  for (int i = 1; i <= m; i++) cin >> u[i] >> v[i];
  dsu.init();
  int r = 0;
  while (r < m && dsu.merge(u[r + 1], v[r + 1])) r++;
  if (r == m) {
    for (int i = 1; i <= q; i++) cout << "NO" << endl;
    return 0;
  }
  fill(pre, pre + N, m + 1);
  QueueUndoTrick solver;
  for (int i = r; i > 0; i--) assert(solver.update(u[i], v[i]));
  pre[r + 1] = m;
  while (pre[r + 1] >= r + 1 && solver.update(u[pre[r + 1]], v[pre[r + 1]]))
    pre[r + 1]--;
  for (int i = r; i >= 1; i--) {
    solver.undoFront();
    pre[i] = pre[i + 1];
    while (pre[i] >= i && solver.update(u[pre[i]], v[pre[i]])) pre[i]--;
  }
  while (q--) {
    int l, r;
    cin >> l >> r;
    if (l > r)
      cout << "YES" << endl;
    else if (r < pre[l])
      cout << "YES" << endl;
    else
      cout << "NO" << endl;
  }
}
