#include <bits/stdc++.h>
using namespace std;
struct DSU
{
DSU(int k) : size(k, 1), p(k), color(k)
{
for (int i = 0; i < k; i++)
p[i] = i;
}
int find(int k)
{
while (k != p[k])
k = p[k];
return k;
}
bool get_color(int k)
{
bool res = false;
while (k != p[k])
{
res ^= color[k];
k = p[k];
}
return res;
}
void join(int a, int b)
{
int r_a = find(a), r_b = find(b);
int c_a = get_color(a), c_b = get_color(b);
if (r_a == r_b)
{
st.push({-1, -1, bip});
if (c_a == c_b)
bip = false;
return;
}
if (size[r_a] < size[r_b])
{
swap(r_a, r_b);
swap(c_a, c_b);
}
st.push({r_b, size[r_a], bip});
size[r_a] += size[r_b];
p[r_b] = r_a;
if (c_a == c_b)
color[r_b] = true;
else
color[r_b] = false;
}
void rollback()
{
auto[b, s_a, old_bip] = st.top();
st.pop();
if (b != -1)
{
int a = p[b];
size[a] = s_a;
p[b] = b;
}
bip = old_bip;
}
void add_edge(pair<int, int> e)
{
join(e.first, e.second);
}
vector<int> size;
vector<int> p;
vector<bool> color;
bool bip = true;
stack<tuple<int, int, bool>> st;
};
vector<pair<int, int>> edges;
vector<int> last;
void rec(int l1, int r1, int l2, int r2, DSU& dsu)
{
if (l1 > r1)
return;
int mid = (l1+r1)/2;
int cp1 = dsu.st.size();
for (int i = l1; i < mid; i++)
dsu.add_edge(edges[i]);
int pivot = r2;
int cp2 = dsu.st.size();
for (; pivot >= l2 && dsu.bip; pivot--)
dsu.add_edge(edges[pivot]);
last[mid] = pivot;
while (dsu.st.size() > cp2)
dsu.rollback();
dsu.add_edge(edges[pivot]);
rec(mid+1, r1, pivot, r2, dsu);
while (dsu.st.size() > cp1)
dsu.rollback();
for (int i = pivot+1; i <= r2; i++)
dsu.add_edge(edges[i]);
rec(l1, mid-1, l2, pivot, dsu);
while (dsu.st.size() > cp1)
dsu.rollback();
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, m, q;
cin >> n >> m >> q;
DSU dsu(n+1);
last.resize(m+1);
edges.resize(m+1);
for (int i = 1; i <= m; i++)
cin >> edges[i].first >> edges[i].second;
rec(1, m, 1, m, dsu);
for (int i = 0; i < q; i++)
{
int l, r;
cin >> l >> r;
if (last[l] >= r)
cout << "YES";
else
cout << "NO";
cout << '\n';
}
}
| # | 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... |