#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
struct State {
  int sz, sz_val, par, par_val, arr, arr_val, invalid_cnt_change;
  State() {
    sz = sz_val = par = par_val = arr = arr_val = invalid_cnt_change = 0;
  }
  State(int sz, int sz_val, int par, int par_val, int arr, int arr_val) {
    this->sz = sz;
    this->sz_val = sz_val;
    this->par = par;
    this->par_val = par_val;
    this->arr = arr;
    this->arr_val = arr_val;
    this->invalid_cnt_change = 0;
  }
  State(int invalid_cnt_change) {
    sz = sz_val = par = par_val = arr = arr_val = 0;
    this->invalid_cnt_change = invalid_cnt_change;
  }
};
int state3;
stack<State> rollback;
int par[MAXN];
int n, m, p;
int arr[MAXN];
int sz[MAXN];
int par2[MAXN];
int q[MAXN];
int sz2[MAXN];
vector<pair<int, int>> edges;
map<int, int> r;
int getpar(int a) {
  if (par[a] == a) {
    return a;
  }
  return getpar(par[a]);
}
int get_color(int v) {
  int ans = 0;
  while (1) {
    ans ^= arr[v];
    if (v == par[v]) break;
    v = par[v];
  }
  return ans;
}
bool merge(int a, int b) {
  int ra = getpar(a), rb = getpar(b);
  int ca = get_color(a), cb = get_color(b);
  if (ra == rb) {
    if (ca == cb) {
      rollback.push(0);
      return false;
    } else {
      rollback.push(0);
      return true;
    }
  } else {
    if (sz[ra] < sz[rb]) {
      swap(a, b);
      swap(ra, rb);
      swap(ca, cb);
    }
    rollback.push(State(ra, sz[ra], rb, par[rb], rb, arr[rb]));
    par[rb] = ra;
    sz[ra] += sz[rb];
    if (ca == cb) {
      arr[rb] ^= 1;
    }
    return true;
  }
}
void do_rollback() {
  sz[rollback.top().sz] = rollback.top().sz_val;
  par[rollback.top().par] = rollback.top().par_val;
  arr[rollback.top().arr] = rollback.top().arr_val;
  rollback.pop();
}
void rec(int l1, int l2, int r1, int r2) {
  if (l2 < l1) {
    return;
  }
  int mid = (l1 + l2) / 2;
  int cnt = 0;
  bool bip = true;
  for (int i = l1; i <= mid - 1; i++) {
    if (!merge(edges[i].first, edges[i].second)) {
      bip = false;
    }
    cnt++;
  }
  int cnt2 = 0;
  if (bip == false) {
    q[mid] = r2;
  } else {
    q[mid] = r1;
  }
  for (int i = r2; i >= r1; i--) {
    if (i == m + 1) {
      continue;
    }
    if (q[mid] == r2) {
      break;
    }
    cnt2++;
    if (!merge(edges[i].first, edges[i].second)) {
      q[mid] = i;
      break;
    }
  }
  if (cnt2) {
    while (cnt2--) {
      do_rollback();
    }
  }
  if (l1 == l2) {
    if (cnt) {
      while (cnt--) {
        do_rollback();
      }
    }
    return;
  }
  if (q[mid] == m + 1) {
    for (int i = mid + 1; i <= l2; i++) {
      q[i] = m + 1;
    }
    for (int i = l1; i < mid; i++) {
      do_rollback();
    }
  } else {
    if (!merge(edges[mid].first, edges[mid].second)) {
      for (int i = mid + 1; i <= l2; i++) {
        q[i] = m + 1;
      }
    } else {
      rec(mid + 1, l2, q[mid], r2);
    }
    for (int i = l1; i <= mid; i++) {
      do_rollback();
    }
  }
  for (int i = r2; i > q[mid]; i--) {
    if (i == m + 1) {
      continue;
    }
    merge(edges[i].first, edges[i].second);
  }
  rec(l1, mid - 1, r1, q[mid]);
  for (int i = r2; i > q[mid]; i--) {
    if (i == m + 1) {
      continue;
    }
    do_rollback();
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n >> m >> p;
  for (int i = 1; i <= n; i++) {
    par[i] = i;
    sz[i] = 1;
    arr[i] = 0;
  }
  edges.push_back(make_pair(0, 0));
  for (int i = 1; i <= m; i++) {
    int x, y;
    cin >> x >> y;
    edges.push_back(make_pair(x, y));
  }
  rec(1, m, 1, m + 1);
  for (int i = 1; i <= m; i++) {
  }
  while (p--) {
    int l, r;
    cin >> l >> r;
    if (r >= q[l]) {
      cout << "NO" << '\n';
    } else {
      cout << "YES" << '\n';
    }
  }
}
