记录编号 458482 评测结果 AAAAAAA
题目名称 基本的图问题 最终得分 100
用户昵称 GravatarRegnig Etalsnart 是否通过 通过
代码语言 C++ 运行时间 0.796 s
提交时间 2017-10-11 14:43:09 内存使用 2.34 MiB
显示代码纯文本
#include<cstdio>
using namespace std;
const int maxn=100010,INF=1000000000;
int n,m,k,a[maxn],fa[maxn],minv[maxn<<2],maxv[maxn<<2],ql,qr,i;
int min(int x,int y){return x<y?x:y;}
int max(int x,int y){return x>y?x:y;}
int find(int x)
{
	return fa[x]==x?fa[x]:fa[x]=find(fa[x]);
}
void build(int now,int l,int r)
{
    if(l==r)
    {
    	minv[now]=a[l];
    	maxv[now]=a[l];
    	return;
	}
	int mid=l+((r-l)>>1);
	build(now<<1,l,mid);
	build(now<<1|1,mid+1,r);
	minv[now]=min(minv[now<<1],minv[now<<1|1]);
	maxv[now]=max(maxv[now<<1],maxv[now<<1|1]);
	return;
}
int query1(int now,int l,int r)
{
	if(l>r||ql>r||qr<l)return 0;
	if(l>=ql&&r<=qr)return minv[now];
	int mid=l+((r-l)>>1),ans=INF;
	if(mid>=ql)ans=min(ans,query1(now<<1,l,mid));
    if(mid<qr)ans=min(ans,query1(now<<1|1,mid+1,r));
    return ans;
}
int query2(int now,int l,int r)
{
	if(l>r||ql>r||qr<l)return 0;
	if(l>=ql&&r<=qr)return maxv[now];
	int mid=l+((r-l)>>1),ans=-INF;
	if(mid>=ql)ans=max(ans,query2(now<<1,l,mid));
    if(mid<qr)ans=max(ans,query2(now<<1|1,mid+1,r));
    return ans;
}
int Main()
{
	freopen("basicgraph.in","r",stdin);freopen("basicgraph.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		fa[i]=i;
	}
	build(1,1,n);
	scanf("%d",&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&ql,&qr);
		int minn=query1(1,1,n),maxx=query2(1,1,n);
		int r1=find(minn),r2=find(maxx);
		if(r1!=r2)fa[r1]=r2;
	}
	scanf("%d",&k);
	for(i=1;i<=k;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		if(find(u)==find(v))printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}
int main(){;};
int syy=Main();