This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn = 2e5 + 5, maxvr = maxn * 2;
//const int maxn = 10, maxvr = maxn * 2;
int p[maxvr], siz[maxvr], u[maxn], v[maxn], first[maxn], n, m, q;
vector<int> ch;
int root(int a) { return p[a] == a ? a : root(p[a]); }
void merge(int a, int b)
{
a = root(a), b = root(b);
if (a == b) return;
if (siz[a] < siz[b]) swap(a, b);
siz[a] += siz[b], p[b] = a;
ch.push_back(b);
}
void undo(int until)
{
while (ch.size() > until)
{
siz[p[ch.back()]] -= siz[ch.back()];
p[ch.back()] = ch.back();
ch.pop_back();
}
}
bool add(int i)
{
merge(u[i], v[i]+n), merge(u[i]+n, v[i]);
return root(v[i]) == root(v[i]+n) || root(u[i]) == root(u[i]+n);
}
void divide_and_conquer(int l1, int l2, int r1, int r2, bool odd) // v dsu mame hrany [0,...,l1-1], [r2,...,m+1]
{
if (l1 > l2) return;
int mid = (l1 + l2) >> 1, siz = ch.size();
bool odd2 = odd;
for (int i = l1; i < mid; i++) odd2 |= add(i);
if (odd2) first[mid] = r2;
else for (int i = r2-1; i >= -1; i--)
{
if (i >= 0) odd2 |= add(i);
if (i != -1 && odd2)
{
first[mid] = i;
break;
}
}
undo(siz);
odd2 = odd;
for (int i = r2-1; i >= first[mid]; i--) odd2 |= add(i);
divide_and_conquer(l1, mid-1, r1, first[mid], odd2);
undo(siz);
odd2 = odd;
for (int i = l1; i <= mid; i++) odd2 |= add(i);
divide_and_conquer(mid+1, l2, first[mid], r2, odd2);
undo(siz);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> q;
for (int i = 0; i < 2*n; i++) p[i] = i, siz[i] = 1;
for (int i = 0; i < m; i++) cin >> u[i] >> v[i], u[i]--, v[i]--;
divide_and_conquer(0, m-1, 0, m, false);
while (q--)
{
int l, r;
cin >> l >> r; l--, r--;
if (first[l] > r) cout << "YES\n"; // first[l] - ak mame tuto hranu a prvych l-1 a tie za nou tak mame odd cyclus
else cout << "NO\n";
}
return 0;
}
Compilation message (stderr)
Joker.cpp: In function 'void undo(int)':
Joker.cpp:20:22: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
20 | while (ch.size() > until)
| ~~~~~~~~~~^~~~~~~
# | 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... |