#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
inline void chkmin(T1 &a, T2 b) {
  if (a > b) a = b;
}
template <typename T1, typename T2>
inline void chkmax(T1 &a, T2 b) {
  if (a < b) a = b;
}
using ll = long long;
using ld = long double;
const string FILENAME = "input";
const int MAXN = 500228;
int n, m, q;
int a[MAXN], b[MAXN];
struct dsu {
  vector<pair<int, int> > parent;
  vector<int> rank228;
  vector<pair<pair<int, int>, pair<int, int> > > parentChanges;
  vector<pair<int, pair<int, int> > > rankChanges;
  int it;
  int lastbad;
  void init(int n) {
    parent.resize(n);
    rank228.resize(n);
    for (int i = 0; i < n; i++) {
      parent[i].first = i;
    }
    it = 0;
    lastbad = 1e9;
  }
  pair<int, int> find_set(int v) {
    if (v != parent[v].first) {
      int parity = parent[v].second;
      parentChanges.push_back(make_pair(parent[v], make_pair(v, it)));
      parent[v] = find_set(parent[v].first);
      parent[v].second ^= parity;
    }
    return parent[v];
  }
  void add_edge(int a, int b) {
    it++;
    pair<int, int> pa = find_set(a);
    a = pa.first;
    int x = pa.second;
    pair<int, int> push_back = find_set(b);
    b = push_back.first;
    int y = push_back.second;
    if (a == b) {
      if (x == y) {
        lastbad = it;
      }
    } else {
      if (rank228[a] < rank228[b]) {
        swap(a, b);
      }
      parentChanges.push_back(make_pair(parent[b], make_pair(b, it)));
      parent[b] = make_pair(a, x ^ y ^ 1);
      if (rank228[a] == rank228[b]) {
        rankChanges.push_back(make_pair(rank228[a], make_pair(a, it)));
        ++rank228[a];
      }
    }
  }
  void reCharge(int timer) {
    it = timer;
    while (!parentChanges.empty() &&
           parentChanges.back().second.second > timer) {
      auto x = parentChanges.back();
      parentChanges.pop_back();
      parent[x.second.first] = x.first;
    }
    while (!rankChanges.empty() && rankChanges.back().second.second > timer) {
      auto x = rankChanges.back();
      rankChanges.pop_back();
      rank228[x.second.first] = x.first;
    }
    if (lastbad > it) {
      lastbad = 1e9;
    }
  }
  bool ok() { return lastbad <= it; }
} kek;
int last[MAXN];
void get(int l1, int l2, int r1, int r2) {
  if (l1 > l2) {
    return;
  }
  chkmax(r1, l1 - 1);
  if (r1 == r2) {
    for (int i = l1; i <= l2; i++) {
      last[i] = r2;
    }
    return;
  }
  int lmid = (l1 + l2) / 2;
  int fl = kek.it;
  for (int i = l1; i < lmid; i++) {
    kek.add_edge(a[i], b[i]);
  }
  last[lmid] = lmid - 1;
  for (int i = r2; i >= max(r1, lmid); i--) {
    if (kek.ok()) {
      last[lmid] = i;
      break;
    }
    if (i >= 0) {
      kek.add_edge(a[i], b[i]);
    }
  }
  kek.reCharge(fl);
  if (l1 == l2) {
    return;
  }
  {
    fl = kek.it;
    for (int i = r2; i > last[lmid]; i--) {
      if (i < m) {
        kek.add_edge(a[i], b[i]);
      }
    }
    get(l1, lmid - 1, r1, last[lmid]);
    kek.reCharge(fl);
  }
  {
    fl = kek.it;
    for (int i = l1; i < lmid + 1; i++) {
      kek.add_edge(a[i], b[i]);
    }
    get(lmid + 1, l2, last[lmid], r2);
    kek.reCharge(fl);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m >> q;
  for (int i = 0; i < m; i++) {
    cin >> a[i] >> b[i];
    a[i]--, b[i]--;
  }
  kek.init(n);
  if (max(n, m) <= 200 && q <= 200) {
    for (int it = 0; it < q; it++) {
      int l, r;
      cin >> l >> r;
      l--, r--;
      for (int i = 0; i < l; i++) {
        kek.add_edge(a[i], b[i]);
      }
      for (int i = r + 1; i < m; i++) {
        kek.add_edge(a[i], b[i]);
      }
      if (kek.ok()) {
        cout << "YES\n";
      } else {
        cout << "NO\n";
      }
      kek.reCharge(0);
    }
    return 0;
  }
  get(0, m - 1, -1, m - 1);
  for (int it = 0; it < q; it++) {
    int l, r;
    cin >> l >> r;
    l--, r--;
    if (last[l] >= r) {
      cout << "YES\n";
    } else {
      cout << "NO\n";
    }
  }
}
