Submission #893170

#TimeUsernameProblemLanguageResultExecution timeMemory
893170amirhoseinfar1385Joker (BOI20_joker)C++17
100 / 100
150 ms7368 KiB
#pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2") #include<bits/stdc++.h> using namespace std; const int maxn=200000+10; int n,m,q,dp[maxn],f; pair<int,int>alle[maxn]; struct dsu{ vector<int>ha; int par[maxn],sz[maxn],val[maxn]; dsu(){ for(int i=0;i<maxn;i++){ par[i]=i; sz[i]=1; } } int root(int u){ if(par[u]==u){ return u; } return root(par[u]); } int len(int u){ if(u==par[u]){ return 0; } return len(par[u])+val[u]; } void con(int u,int v){ int rootu=root(u),rootv=root(v); if(rootu!=rootv){ if(sz[rootu]<sz[rootv]){ swap(rootu,rootv); swap(u,v); } int lu=len(u),lv=len(v); par[rootv]=rootu; sz[rootu]+=sz[rootv]; if((lu&1)==(lv&1)){ val[rootv]=1; } else{ val[rootv]=0; } ha.push_back(rootv); return ; } ha.push_back(-1); } bool two(int u,int v){ int rootu=root(u),rootv=root(v); if(rootu!=rootv){ return 0; } int lu=len(u),lv=len(v); if((lu&1)==(lv&1)){ return 1; } return 0; } void back(){ if((int)ha.back()==-1){ ha.pop_back(); return ; } int x=ha.back(); sz[par[x]]-=sz[x]; par[x]=x; val[x]=0; ha.pop_back(); return ; } }ds; void solve(int l,int r,int tl,int tr){ if(l>r){ return ; } if(tl==tr){ for(int i=l;i<=r;i++){ dp[i]=tl; } return ; } int opt=0; int now=ds.ha.size(); int mid=(l+r)>>1; for(int i=l;i<=mid;i++){ ds.con(alle[i].first,alle[i].second); } for(int i=tr;i>=tl;i--){ if(ds.two(alle[i].first,alle[i].second)){ opt=i; break; } ds.con(alle[i].first,alle[i].second); } dp[mid]=opt; while((int)ds.ha.size()>now){ ds.back(); } for(int i=l;i<=mid;i++){ ds.con(alle[i].first,alle[i].second); } solve(mid+1,r,opt,tr); while((int)ds.ha.size()>now){ ds.back(); } for(int i=tr;i>opt;i--){ ds.con(alle[i].first,alle[i].second); } solve(l,mid-1,tl,opt); while((int)ds.ha.size()>now){ ds.back(); } } int pre(){ for(int i=1;i<=m;i++){ if(ds.two(alle[i].first,alle[i].second)){ return i; } ds.con(alle[i].first,alle[i].second); } return m+1; } int suf(){ for(int i=m;i>=0;i--){ if(ds.two(alle[i].first,alle[i].second)){ return i; } ds.con(alle[i].first,alle[i].second); } return 0; } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>m>>q; for(int i=1;i<=m;i++){ cin>>alle[i].first>>alle[i].second; } int ind=pre(); while((int)ds.ha.size()>0){ ds.back(); } solve(1,ind-1,0,m); for(int i=ind;i<=m;i++){ dp[i]=m+2; } if((int)ds.ha.size()!=0){ assert(0); } dp[0]=suf(); for(int i=0;i<q;i++){ int l,r; cin>>l>>r; if(dp[l-1]<=r){ cout<<"NO\n"; } else{ cout<<"YES\n"; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...