#include <bits/stdc++.h>
using namespace std;
#define POPCOUNT(n) (__builtin_popcountll((n)))
#define CLZ(n) (__builtin_clzll((n)))
#define CTZ(n) (__builtin_ctzll((n)))
#define LOG(n) (63 - __builtin_clzll((n)))
#define BIT(n, i) (((n) >> (i)) & 1ll)
#define MASK(i) (1ll << (i))
#define FLIP(n, i) ((n) ^ (1ll << (i)))
#define ON(n, i) ((n) | MASK(i))
#define OFF(n, i) ((n) & ~MASK(i))
#define Int __int128
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<long long, long long> pll;
typedef pair<long long, int> pli;
typedef pair<int, long long> pil;
typedef vector<pair<int, int>> vii;
typedef vector<pair<long long, long long>> vll;
typedef vector<pair<long long, int>> vli;
typedef vector<pair<int, long long>> vil;
template <class T1, class T2> bool maximize(T1 &x, T2 y) {
if (x < y) {
x = y;
return true;
}
return false;
}
template <class T1, class T2> bool minimize(T1 &x, T2 y) {
if (x > y) {
x = y;
return true;
}
return false;
}
template <class T> void remove_duplicate(vector<T> &ve) {
sort (ve.begin(), ve.end());
ve.resize(unique(ve.begin(), ve.end()) - ve.begin());
}
mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
long long random(long long l, long long r) {
return uniform_int_distribution<long long>(l, r)(rng);
}
unsigned long long random(unsigned long long l, unsigned long long r) {
return uniform_int_distribution<unsigned long long>(l, r)(rng);
}
template <class T> T random(T r) {
return rng() % r;
}
const int N = 1e6 + 5;
const int MOD = 1e9 + 7;
const int inf = 1e9;
const long long INF = 1e18;
int n, m, q;
int bestR[N];
pii edges[N];
int CLONE(int u) {
return (u <= n ? u + n : u - n);
}
struct DSU {
vector<int> par, sz;
vii ve;
bool existOdd;
DSU() {}
void resize(int n) {
existOdd = false; ve.clear();
sz.assign(n + 1, 1);
par.assign(n + 1, 0);
for (int i = 1; i <= n; ++i) par[i] = i;
}
int find_set(int p) {
return par[p] == p ? p : find_set(par[p]);
}
bool same_set(int u, int v) {
return find_set(u) == find_set(v);
}
bool join(int u, int v) {
u = find_set(u), v = find_set(v);
if (u != v) {
if (sz[u] < sz[v]) swap(u, v);
ve.emplace_back(v, existOdd);
sz[u] += sz[v], par[v] = u;
existOdd |= same_set(u, CLONE(u));
existOdd |= same_set(v, CLONE(v));
return true;
}
return false;
}
void rollback(int checkpoint) {
while (ve.size() > checkpoint) {
auto [v, odd] = ve.back(); ve.pop_back();
sz[par[v] = v] -= sz[v], existOdd = odd;
}
}
} dsu;
void addEdge(int id) {
auto [u, v] = edges[id];
dsu.join(u, CLONE(v));
dsu.join(v, CLONE(u));
}
void dnc(int l, int r, int optL, int optR) {
if (l > r) return;
int mid = (l + r) >> 1;
int checkpoint1 = dsu.ve.size();
for (int i = l; i < mid; ++i) addEdge(i);
// cerr << "mid bestodd " << mid << ' ' << dsu.existOdd << '\n';
int &optMid = bestR[mid]; optMid = optR;
int checkpoint2 = dsu.ve.size();
while (optMid > mid && !dsu.existOdd) addEdge(--optMid);
// cerr << "mid = " << mid << ' ' << optMid << '\n';
dsu.rollback(checkpoint2);
addEdge(mid);
dnc(mid + 1, r, optMid, optR);
dsu.rollback(checkpoint1);
for (int i = optR - 1; i >= optMid; --i) addEdge(i);
dnc(l, mid - 1, optL, optMid);
}
signed main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin >> n >> m >> q;
for (int i = 1; i <= m; ++i) {
int u, v; cin >> u >> v;
edges[i] = make_pair(u, v);
}
dsu.resize(n + n);
// for (int i = 1; i <= 3; ++i) addEdge(i);
// cerr << dsu.existOdd << '\n';
dnc(1, m, 0, m + 1);
for (int i = 1; i <= q; ++i) {
int l, r; cin >> l >> r;
if (r < bestR[l]) 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... |