#include <iostream>
#include <vector>
using namespace std;
constexpr int N = 2e5;
pair<int, int> edges[N];
int f[N];
struct DSU {
vector<int> parent;
vector<char> parity;
bool bipartite;
DSU(int n) {
parent.assign(n, -1);
parity.assign(n, 0);
bipartite = true;
}
pair<int, bool> find_set(int v) {
if (parent[v] < 0) return {v, parity[v]};
pair<int, bool> p = find_set(parent[v]);
return {parent[v] = p.first, parity[v] ^= p.second};
}
void add_edge(int e) {
auto [u, x] = find_set(edges[e].first);
auto [v, y] = find_set(edges[e].second);
if (u == v) {
if (x == y) bipartite = false;
return;
}
if (parent[u] > parent[v]) swap(u, v);
parent[u] += parent[v];
parent[v] = u;
parity[v] = x ^ y ^ 1;
}
inline bool is_bipartite() const {
return bipartite;
}
};
void dnc(int l, int r, int fl, int fr, const DSU &dsu) {
if (l >= r) return;
int m = l + r + 1 >> 1;
{
DSU new_dsu = dsu;
for (int e = r; e > m; e--) {
new_dsu.add_edge(e);
}
for (f[m] = fl; f[m] < min(fr, m) && new_dsu.is_bipartite(); f[m]++) {
new_dsu.add_edge(f[m]);
}
}
{
DSU new_dsu = dsu;
for (int e = r; e >= m; e--) {
new_dsu.add_edge(e);
}
dnc(l, m - 1, fl, f[m], new_dsu);
}
{
DSU new_dsu = dsu;
for (int e = fl + 1; e <= f[m]; e++) {
new_dsu.add_edge(e);
}
dnc(m, r, f[m], fr, new_dsu);
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
// freopen("input.txt", "r", stdin);
int n, m, q;
cin >> n >> m >> q;
for (int e = 0; e < m; e++) {
int u, v;
cin >> u >> v;
edges[e] = {u - 1, v - 1};
}
dnc(0, m, 0, m, DSU(n));
while (q--) {
int l, r;
cin >> l >> r;
l--;
cout << (l >= f[r] ? "YES\n" : "NO\n");
}
return 0;
}