#include<bits/stdc++.h>
using namespace std;
const int N=200005;
int n,m,q;
int eu[N],ev[N],opt[N];
struct DSU{
int p[N],sz[N],c[N];
bool ans;
int t;
vector<tuple<int,int,int,bool>> s;
void init(){
for(int i=1;i<=n;i++)p[i]=i,sz[i]=1,c[i]=0;
ans=true;
t=0;
s.clear();
}
int fp(int u){return u==p[u]?u:fp(p[u]);}
int col(int u){return c[u]^(u==p[u]?0:col(p[u]));}
int uni(int i){
t++;
int u=eu[i],v=ev[i];
int cu=col(u),cv=col(v);
u=fp(u),v=fp(v);
if(u==v){
if(cu==cv){
s.emplace_back(t,0,0,ans);
ans=false;
}
}else{
if(sz[u]>sz[v])swap(u,v);
if(cu==cv)c[v]^=1;
sz[u]+=sz[v];
p[v]=u;
s.emplace_back(t,u,v,ans);
}
return t;
}
void rollback(int x){
t=x;
while(!s.empty()){
auto [tt,u,v,a]=s.back();
if(tt<=t)break;
if(u){
sz[u]-=sz[v];
p[v]=v;
}
ans=a;
s.pop_back();
}
}
}dsu;
void dnc(int l,int r,int optl,int optr){
if(l>r)return;
int m=(l+r)/2;
opt[m]=optr;
int t1=dsu.t;
for(int i=l;i<m;i++)dsu.uni(i);
int t2=dsu.t;
while(dsu.ans&&opt[m]>=max(m,optl+1))dsu.uni(opt[m]--);
dsu.rollback(t2);
dsu.uni(m);
dnc(m+1,r,opt[m],optr);
dsu.rollback(t1);
dnc(l,m-1,optl,opt[m]);
}
int main(){
cin.tie(nullptr)->sync_with_stdio(false);
cin >> n >> m >> q;
for(int i=1;i<=m;i++)cin >> eu[i] >> ev[i];
dsu.init();
dnc(1,m,0,m);
while(q--){
int l,r;
cin >> l >> r;
cout << (opt[l]>=r?"YES":"NO") << "\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... |