제출 #893175

#제출 시각아이디문제언어결과실행 시간메모리
893175amirhoseinfar1385Joker (BOI20_joker)C++17
100 / 100
119 ms6768 KiB
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
#include<bits/stdc++.h>
using namespace std;
const unsigned int maxn=200000+10;
unsigned int n,m,q,dp[maxn],f;
pair<unsigned int,unsigned int>alle[maxn];

struct dsu{
	vector<unsigned int>ha;
	unsigned int par[maxn],sz[maxn];
	unsigned char val[maxn];
	dsu(){
		for(unsigned int i=0;i<maxn;i++){
			par[i]=i;
			sz[i]=1;
		}
	}
	unsigned int root(unsigned int u){
		while(u!=par[u]){
			u=par[u];
		}
		return u;
	}
	unsigned char len(unsigned int u){
		unsigned int ret=0;
		while(u!=par[u]){
			ret+=val[u];
			u=par[u];
		}
		return ret;
	}

	void con(unsigned int u,unsigned int v){
		unsigned int rootu=root(u),rootv=root(v);
		if(rootu!=rootv){
			if(sz[rootu]<sz[rootv]){
				swap(rootu,rootv);
				swap(u,v);
			}
			unsigned char 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(0);
	}
	bool two(unsigned int u,unsigned int v){
		unsigned int rootu=root(u),rootv=root(v);
		if(rootu!=rootv){
			return 0;
		}
		unsigned char  lu=len(u),lv=len(v);
		if((lu&1)==(lv&1)){
			return 1;
		}
		return 0;
	}
	void back(){
		if((unsigned int)ha.back()==0){
			ha.pop_back();
			return ;
		}
		unsigned int x=ha.back();
		sz[par[x]]-=sz[x];
		par[x]=x;
		val[x]=0;
		ha.pop_back();
		return ;
	}
}ds;

void solve(unsigned int l,unsigned int r,unsigned int tl,unsigned int tr){
	if(l>r){
		return ;
	}
	if(tl==tr){
		for(unsigned int i=l;i<=r;i++){
			dp[i]=tl;
		}
		return ;
	}
	unsigned int opt=0;
	unsigned int now=ds.ha.size();
	unsigned int mid=(l+r)>>1;
	for(unsigned int i=l;i<=mid;i++){
		ds.con(alle[i].first,alle[i].second);
	}
	for(unsigned 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((unsigned int)ds.ha.size()>now){
		ds.back();
	}
	for(unsigned int i=l;i<=mid;i++){
		ds.con(alle[i].first,alle[i].second);
	}
	solve(mid+1,r,opt,tr);
	while((unsigned int)ds.ha.size()>now){
		ds.back();
	}
	for(unsigned int i=tr;i>opt;i--){
		ds.con(alle[i].first,alle[i].second);
	}
	solve(l,mid-1,tl,opt);
	while((unsigned int)ds.ha.size()>now){
		ds.back();
	}
}

unsigned int pre(){
	for(unsigned 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;
}

unsigned int suf(){
	for(unsigned 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(unsigned int i=1;i<=m;i++){
		cin>>alle[i].first>>alle[i].second;
	}
	unsigned int ind=pre();
	while((unsigned int)ds.ha.size()>0){
		ds.back();
	}
	solve(1,ind-1,0,m);
	for(unsigned int i=ind;i<=m;i++){
		dp[i]=m+2;
	}
	if((unsigned int)ds.ha.size()!=0){
		assert(0);
	}
	dp[0]=suf();
	for(unsigned int i=0;i<q;i++){
		unsigned 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...