记录编号 458430 评测结果 AAAAAAA
题目名称 基本的图问题 最终得分 100
用户昵称 GravatarFisher. 是否通过 通过
代码语言 C++ 运行时间 0.677 s
提交时间 2017-10-11 10:50:38 内存使用 4.13 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-48;c=getchar();}
	return x*f;
}
const int maxn=100010;
int n,m;
int fa[maxn];
inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int data[maxn];
int maxx[maxn<<2],minn[maxn<<2];
inline void build(int o,int l,int r){
	if(l==r){
		maxx[o]=minn[o]=data[l];
		return ;
	}
	int m=(l+r)>>1,ls=o<<1,rs=ls|1;
	build(ls,l,m);
	build(rs,m+1,r);
	maxx[o]=max(maxx[ls],maxx[rs]);
	minn[o]=min(minn[ls],minn[rs]);
}
inline int findmin(int o,int l,int r,int nl,int nr){
	if(l>=nl&&r<=nr)return minn[o];
	int m=(l+r)>>1,ls=o<<1,rs=ls|1;
	int ans=0x7fffffff;
	if(m>=nl)ans=min(ans,findmin(ls,l,m,nl,nr));
	if(m<nr)ans=min(ans,findmin(rs,m+1,r,nl,nr));
	return ans;
}
inline int findmax(int o,int l,int r,int nl,int nr){
	if(l>=nl&&r<=nr)return maxx[o];
	int m=(l+r)>>1,ls=o<<1,rs=ls|1;
	int ans=-0x7fffffff;
	if(m>=nl)ans=max(ans,findmax(ls,l,m,nl,nr));
	if(m<nr)ans=max(ans,findmax(rs,m+1,r,nl,nr));
	return ans;
}
int main(){
	freopen("basicgraph.in","r",stdin);
	freopen("basicgraph.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++){
		fa[i]=i;
		data[i]=read();
	}
	build(1,1,n);
	m=read();
	for(int i=1;i<=m;i++){
		int l=read(),r=read();
		int u=findmax(1,1,n,l,r);
		int v=findmin(1,1,n,l,r);
		u=find(u);v=find(v);
		fa[u]=v;
	}
	m=read();
	for(int i=1;i<=m;i++){
		int u=read(),v=read();
		if(find(u)==find(v))puts("YES");
		else puts("NO");
	}
	return 0;
}