# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1153489 | Robert_junior | Joker (BOI20_joker) | C++20 | 0 ms | 0 KiB |
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin(), x.end()
#define ins insert
#define pb push_back
#define F first
#define S second
const int N = 4e5+100, M = 5e5 + 7;
const int mod = 998244353;
int opt[N], block[N], f[N], p[N], sz[N];
pair<int, int>g[N];
stack<pair<int, int>>s;
bool ok = 1;
pair<int, int>get(int v){
if(p[v] == v) return {v, 0};
pair<int, int>val = get(p[v]);
return {val.F, (val.S + f[v]) % 2};
}
void unite(int i){
int u = g[i].F, v = g[i].S;
if(u == -1) return;
pair<int, int>x = get(u), y = get(v);
if(x.F == y.F){
if(y.S == x.S){
if(ok){
ok = 0;
s.push({-1, -1});
}
}
return;
}
if(sz[x.F] < sz[y.F]) swap(x, y);
s.push({x.F, sz[x.F]});
s.push({y.F, sz[y.F]});
sz[x.F] += sz[y.F];
p[y.F] = x.F;
f[y.F] = (x.S + y.S + 1) % 2;
}
void otkat(){
while(s.size() && block[s.size()] == 0){
pair<int, int>x = s.top();
s.pop();
if(x.F == -1){
ok = 1;
continue;
}
p[x.F] = x.F;
f[x.F] = 0;
sz[x.F] = x.S;
}
block[s.size()]--;
}
void dnc(int l, int r, int optr){
if(l > r) return;
int m = (l + r) / 2;
for(int i = l; i < m; i++){
unite(i);
}
block[s.size()]++;
for(int i = optr; i >= m; i--){
unite(i);
if(!ok){
opt[m] = r;
break;
}
}
otkat();
unite(m);
dnc(m + 1, r, optr);
otkat();
if(!opt[m]) return;
for(int i = optr; i > opt[m]; i--){
unite(i);
}
dnc(l, m - 1, opt[m]);
otkat();
}
void solve(){
int n, m, q;
cin>>n>>m>>q;
for(int i = 1; i <= n; i++){
p[i] = i;
sz[i] = 1;
}
for(int i = 1; i <= m; i++){
cin>>g[i].F>>g[i].S;
}
g[m + 1] = {-1, -1};
dnc(1, m, m + 1);
while(q--){
int l, r;
cin>>l>>r
l = max(l, 1);
r = min(r, m);
if(opt[l] > r) cout<<"YES\n";
else cout<<"NO\n";
}
}
main(){
ios_base :: sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
//cin>>t;
for(int i = 1; i <= t; i++){
//cout<<"Case "<<i<<": ";
solve();
}
}