#include<bits/stdc++.h>
using namespace std;
#define task "task"
#define ii pair<int,int>
#define fi first
#define se second
#define int long long
#define ll long long
#define ld double
#define mp make_pair
#define lg2 30
#define iii pair<ll,ii>
#define iiii pair<ii,ii>
#define base 29
#define eps 1e-8
int dx[]= {0LL,0LL,1,-1,1,1,-1,-1};
int dy[]= {1,-1,0LL,0LL,1,-1,1,-1};
const int maxn=2e5+5,maxm=1e4+5,maxq=1e5+5;
const int mod=1e9+7;
ii edge[maxn],par[maxn];
int f[maxn];
int rk[maxn],n,m,q;
struct node
{
int a,x,b,y,c;
};
stack<node>st;
bool bipartiteness=true,nho[maxn];
ii acs(int u)
{
if(u!=par[u].fi)
{
int parity=par[u].se;
par[u]=acs(par[u].fi);
par[u].se^=parity;
}
return par[u];
}
bool join(int u,int v)
{
ii pa=acs(u),pb=acs(v);
int a=pa.fi,x=pa.se;
int b=pb.fi,y=pb.se;
if(a==b)
{
if(x==y)
{
st.push({a,rk[a],b,rk[b],bipartiteness});
bipartiteness=false;
return true;
}
return false;
}
if(rk[a]>rk[b])swap(a,b);
st.push({a,rk[a],b,rk[b],bipartiteness});
par[a]={b,x^y^1};
if(rk[b]==rk[a])rk[b]++;
return true;
}
void rollback()
{
node t=st.top();
st.pop();
int a=t.a,b=t.b,x=t.x,y=t.y,c=t.c;
par[a]={a,0};
par[b]={b,0};
rk[a]=x;
rk[b]=y;
bipartiteness=c;
}
void init()
{
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
{
par[i]={i,0};
}
for(int i=1;i<=m;i++)
{
cin>>edge[i].fi>>edge[i].se;
}
}
void dnc(int l1,int l2,int r1,int r2)
{
if(l1>l2)return;
int mid=(l1+l2)/2;
/*if(mid==1)
{
cout<<bipartiteness<<'\n';
cout<<r1<<" "<<r2<<'\n';
}
if(mid==1)
{
for(int i=1;i<=n;i++)
{
cout<<acs(par[i].fi).fi<<" ";
}
cout<<'\n';
}*/
for(int i=l1;i<mid;i++)
{
nho[i]=join(edge[i].fi,edge[i].se);
}
f[mid]=max(r1,mid)-1;
for(int i=r2;i>=max(r1,mid);i--)
{
if(!bipartiteness)
{
f[mid]=i;
break;
}
nho[i]=join(edge[i].fi,edge[i].se);
}
for(int i=f[mid]+1;i<=r2;i++)
{
if(nho[i])rollback();
}
for(int i=mid-1;i>=l1;i--)
{
if(nho[i])rollback();
}
for(int i=f[mid]+1;i<=r2;i++)
{
// cout<<mid<<" "<<i<<'\n';
nho[i]=join(edge[i].fi,edge[i].se);
}
// cout<<l1<<" "<<l2<<" "<<f[mid]+1<<":"<<r2<<" "<<bipartiteness<<'\n';
dnc(l1,mid-1,r1,f[mid]);
for(int i=r2;i>=f[mid]+1;i--)if(nho[i])rollback();
for(int i=l1;i<=mid;i++)nho[i]=join(edge[i].fi,edge[i].se);
dnc(mid+1,l2,f[mid],r2);
for(int i=mid;i>=l1;i--)if(nho[i])rollback();
}
void process()
{
dnc(1,m,1,m);
/*for(int i=1;i<=m;i++)
{
cout<<f[i]<<" ";
}
cout<<'\n';*/
while(q--)
{
int l,r;
cin>>l>>r;
if(f[l]>=r)
{
cout<<"YES"<<'\n';
}
else
cout<<"NO"<<'\n';
}
}
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
if(fopen(task".inp","r"))
{
freopen(task".inp","r",stdin);
freopen(task".out","w",stdout);
}
init();
process();
cerr <<endl<< "TIME : " << clock() * 0.001 << "s" << endl ;
}
컴파일 시 표준 에러 (stderr) 메시지
Joker.cpp: In function 'int main()':
Joker.cpp:162:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
162 | freopen(task".inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
Joker.cpp:163:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
163 | freopen(task".out","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
# | 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... |