#include <bits/stdc++.h>
using namespace std;
int n, m, q;
int l, r;
struct UF {
vector<int> sz, p, lazy, value;
UF(int n) : sz(n, 1), p(n, -1), lazy(n, 0), value(n, 0) {}
bool get_color(int a) {
value[a] = (value[a] + lazy[a]) % 2;
if (0 <= p[a])
lazy[p[a]] = (lazy[p[a]] + lazy[a]) % 2;
lazy[a] = 0;
return value[a];
}
int find(int a) {
get_color(a);
return p[a] < 0 ? a : p[a] = find(p[a]);
}
void join(int a, int b) {
int u = find(a), v = find(b);
if (u == v)
return;
if (sz[u] < sz[v])
swap(u, v);
p[v] = u;
sz[u] += sz[v];
if (value[v] == value[u])
lazy[v] = 1;
}
};
int main() {
cin >> n >> m >> q;
vector<pair<int, int>> edg;
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
a--;
b--;
edg.push_back({a, b});
}
vector<tuple<int, int, int>> queries;
for (int i = 0; i < q; i++) {
cin >> l >> r;
l--;
r--;
queries.push_back({l, r, i});
}
sort(queries.rbegin(), queries.rend());
UF uf(n);
vector<bool> ans(q);
int prev_r = m;
bool works = false;
for (auto [l, r, idx] : queries) {
for (int i = r; i < prev_r; i++) {
auto [a, b] = edg[i];
if (uf.find(a) == uf.find(b) && uf.get_color(a) == uf.get_color(b))
works = true;
uf.join(a, b);
}
ans[idx] = works;
prev_r = r;
}
for (int i = 0; i < q; i++)
if (ans[i])
cout << "YES\n";
else
cout << "NO\n";
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |