记录编号 |
305718 |
评测结果 |
AAAAAAA |
题目名称 |
基本的图问题 |
最终得分 |
100 |
用户昵称 |
Hzoi_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");
}
}