记录编号 323630 评测结果 AAAAAAA
题目名称 基本的图问题 最终得分 100
用户昵称 Gravatarjmisnal 是否通过 通过
代码语言 C++ 运行时间 0.557 s
提交时间 2016-10-16 21:12:37 内存使用 22.07 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int read()
{
	int x=0;char ch=getchar();
	while(ch<'0'||ch>'9')ch=getchar();
	while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
	return x;
}
int n,m,Q;
int a[100050],mx[100050][25],mn[100050][25];
int bin[20],L[500000];
void init()
{
	for(int i=1;i<=n;i++)
		mn[i][0]=mx[i][0]=a[i];
//	int m=log(n)/log(2);
	for(int i=1;i<=18;i++)
		for(int j=1;j<=n;j++)
		{
			mx[j][i]=mx[j][i-1];
			mn[j][i]=mn[j][i-1];
			if(j+bin[i]-1<=n)
			{
				mx[j][i]=max(mx[j][i-1],mx[j+bin[i-1]][i-1]);
				mn[j][i]=min(mn[j][i-1],mn[j+bin[i-1]][i-1]);
			}
			else break;
		}			
	

}
int rminq(int l,int r)
{
	int m=L[r-l+1],R=r-bin[m]+1;
	return min(mn[l][m],mn[R][m]);
}
int rmaxq(int l,int r)
{
	int m=L[r-l+1],R=r-bin[m]+1;
	return max(mx[l][m],mx[R][m]);
}
int fa[100050];
int find(int x)
{
	return x==fa[x]?x:fa[x]=find(fa[x]);
}
int main()
{
	bin[0]=1;
	for(int i=1;i<=19;i++)
		bin[i]=(bin[i-1]<<1);
	L[0]=-1;
	for(int i=1;i<500000;i++)L[i]=L[i>>1]+1;
	freopen("basicgraph.in","r",stdin);
	freopen("basicgraph.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++)
		a[i]=read();		
	init();
//	cout<<'a';return 0;
	for(int i=1;i<=n;i++)
		fa[i]=i;
	scanf("%d",&m);
	int l,r,x1,x2,a,b;
	for(int i=1;i<=m;i++)
	{
		//scanf("%d%d",&l,&r);
		l=read(),r=read();
		int m=L[r-l+1],R=r-bin[m]+1;
		if(mx[l][m]>mx[R][m])
			x2=mx[l][m];
		else x2=mx[R][m];
		if(mn[l][m]<mn[R][m])
			x1=mn[l][m];
		else x1=mn[R][m];
	//	x1=rminq(l,r),x2=rmaxq(l,r);
		a=find(x1);b=find(x2);
		if(a!=b)
			fa[a]=b;
		//fa[find(x1)]=find(x2);
	}
//	return 0;
	scanf("%d",&Q);
	for(int i=1;i<=Q;i++)
	{
		scanf("%d%d",&l,&r);
		if(find(l)==find(r))
			printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}