#include <bits/stdc++.h>
using namespace std;
struct dsu {
  int currT;
  vector<vector<pair<int, int> > > par, rank, ad;
  vector<pair<int, int> > mods;
  dsu(int n = 0) {
    currT = 0;
    par = vector<vector<pair<int, int> > >(n, vector<pair<int, int> >());
    rank = vector<vector<pair<int, int> > >(n, vector<pair<int, int> >());
    ad = vector<vector<pair<int, int> > >(n, vector<pair<int, int> >());
    for (int i = 0; i < (n); i++) {
      par[i].push_back(make_pair(currT, i));
      rank[i].push_back(make_pair(currT, 0));
      ad[i].push_back(make_pair(currT, 0));
    }
  }
  int root(int x) {
    if (par[x].back().second == x) {
      return x;
    }
    return root(par[x].back().second);
  }
  int parity(int x) {
    if (par[x].back().second == x) {
      return ad[x].back().second;
    }
    return ad[x].back().second ^ 1 ^ parity(par[x].back().second);
  }
  void join(int u, int v) {
    int r1 = root(u), r2 = root(v);
    if (r1 == r2) {
      return;
    }
    if (rank[r1].back().second < rank[r2].back().second) {
      swap(r1, r2);
      swap(u, v);
    }
    int p1 = parity(u), p2 = parity(v);
    currT++;
    par[r2].push_back(make_pair(currT, r1));
    if ((ad[r1].back().second ^ 1 ^ p2) == p1) {
      ad[r2].push_back(make_pair(currT, ad[r2].back().second ^ 1));
    }
    mods.push_back(make_pair(currT, r2));
    if (rank[r2].back().second == rank[r1].back().second) {
      rank[r1].push_back(make_pair(currT, rank[r1].back().second + 1));
      mods.push_back(make_pair(currT, r1));
    }
  }
  void revertNode(int node, int t) {
    while (par[node].back().first > t) {
      par[node].pop_back();
    }
    while (rank[node].back().first > t) {
      rank[node].pop_back();
    }
    while (ad[node].back().first > t) {
      ad[node].pop_back();
    }
  }
  void revert(int t) {
    while (!mods.empty() && mods.back().first > t) {
      revertNode(mods.back().second, t);
      mods.pop_back();
    }
  }
};
int n, m, q, maxReach[200000];
vector<pair<int, int> > edges;
dsu d;
bool tryJoin(int u, int v) {
  if (d.root(u) == d.root(v)) {
    if (d.parity(u) == d.parity(v)) {
      return false;
    } else {
      return true;
    }
  } else {
    d.join(u, v);
    return true;
  }
}
void solve(int leftLo, int leftHi, int rightLo, int rightHi) {
  if (leftLo >= leftHi) {
    return;
  }
  int startT = d.currT;
  int curr = (leftLo + leftHi) / 2;
  for (int i = (max(0, leftLo - 1)); i < (curr); i++) {
    if (!tryJoin(edges[i].first, edges[i].second)) {
      for (int j = (curr); j < (leftHi); j++) maxReach[j] = rightHi;
      d.revert(startT);
      solve(leftLo, curr, rightLo, rightHi);
      return;
    }
  }
  int leftDoneT = d.currT;
  maxReach[curr] = min(m, rightHi);
  for (int i = (min(m, rightHi)) - 1; i >= (rightLo); i--) {
    if (tryJoin(edges[i].first, edges[i].second)) {
      maxReach[curr] = i;
    } else {
      break;
    }
  }
  d.revert(leftDoneT);
  solve(curr + 1, leftHi, maxReach[curr], rightHi);
  d.revert(startT);
  for (int i = (min(m, rightHi)) - 1; i >= (maxReach[curr]); i--) {
    tryJoin(edges[i].first, edges[i].second);
  }
  solve(leftLo, curr, rightLo, maxReach[curr]);
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m >> q;
  for (int i = 0; i < (m); i++) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    edges.push_back(make_pair(u, v));
  }
  d = dsu(n);
  solve(0, m, 0, m + 1);
  for (int i = 0; i < (q); i++) {
    int l, r;
    cin >> l >> r;
    l--, r--;
    if (r + 1 < maxReach[l]) {
      cout << "YES\n";
    } else {
      cout << "NO\n";
    }
  }
}
