记录编号 305718 评测结果 AAAAAAA
题目名称 基本的图问题 最终得分 100
用户昵称 GravatarHzoi_Go灬Fire 是否通过 通过
代码语言 C++ 运行时间 1.263 s
提交时间 2016-09-11 06:26:59 内存使用 13.98 MiB
显示代码纯文本
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
using namespace std;
const int maxn=100000*6;
struct Edge{
	int next,to,dis;
}e[maxn];
struct Node{
	int max,min;
}a[maxn];
int n,cnt,len,head[maxn],root[maxn];
void Init();
void Insert(int x,int y){
	len++;e[len].to=y;e[len].next=head[x];head[x]=len;
}
void Build(int rt,int l,int r){
	if(l==r){
		scanf("%d",&a[rt].max);
		a[rt].min=a[rt].max;
		return;
	}
	int mid=(l+r)>>1;
	Build(lson);Build(rson);
	a[rt].max=max(a[rt<<1].max,a[rt<<1|1].max);
	a[rt].min=min(a[rt<<1].min,a[rt<<1|1].min);
}
int Get_max(int s,int t,int rt,int l,int r){
	if(s<=l && t>=r){
		return a[rt].max;
	}
	int mid=(l+r)>>1;
	if(t<=mid)return Get_max(s,t,lson);
	if(s>mid)return Get_max(s,t,rson);
	return max(Get_max(s,t,lson),Get_max(s,t,rson));
}
int Get_min(int s,int t,int rt,int l,int r){
	if(s<=l && t>=r){
		return a[rt].min;
	}
	int mid=(l+r)>>1;
	if(t<=mid)return Get_min(s,t,lson);
	if(s>mid)return Get_min(s,t,rson);
	return min(Get_min(s,t,lson),Get_min(s,t,rson));
}
int Findroot(int x){
	if(x!=root[x]){
		root[x]=Findroot(root[x]);
	}
	return root[x];
}
int main(){
	freopen("basicgraph.in","r",stdin);
	freopen("basicgraph.out","w",stdout);
    Init();
    //system("pause");
    return 0;
}
void Init(){
	scanf("%d",&n);
	Build(1,1,n);
	for(int i=1;i<=n;i++)root[i]=i;
    int m;scanf("%d",&m);
    for(int i=1;i<=m;i++){
		int x,y;scanf("%d%d",&x,&y);
		int A=Get_max(x,y,1,1,n),B=Get_min(x,y,1,1,n);
		int ra=Findroot(A),rb=Findroot(B);
		//printf("<<%d %d>>\n",A,B);
		if(ra==rb)continue;
		if(ra<rb)root[rb]=ra;
		else root[ra]=rb;
	}
	int k;scanf("%d",&k);
	for(int i=1;i<=k;i++){
		int x,y;scanf("%d%d",&x,&y);
		int rx=Findroot(x),ry=Findroot(y);
		if(rx==ry)printf("YES\n");
		else printf("NO\n");
	}
}