记录编号 |
306405 |
评测结果 |
AAAAAAA |
题目名称 |
基本的图问题 |
最终得分 |
100 |
用户昵称 |
Riolu |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.000 s |
提交时间 |
2016-09-11 22:38:07 |
内存使用 |
22.85 MiB |
显示代码纯文本
/*
Riolu
2016-9-11
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 200001
int n,m;
int a[N];
int f[N][25][2];//0 max 1 min
int fa[N];
void RMQ(){
int i,j;
for(j=1;j<=(log(n)/log(2));j++)
for(i=1;i<=n;i++){
f[i][j][0]=max(f[i][j-1][0],f[i+(1<<(j-1))][j-1][0]);
f[i][j][1]=min(f[i][j-1][1],f[i+(1<<(j-1))][j-1][1]);
}
}
int rm(int i,int j,int x){
int k=log(j-i+1)/log(2);
if(x)return min(f[i][k][1],f[j-(1<<k)+1][k][1]);
else return max(f[i][k][0],f[j-(1<<k)+1][k][0]);
}
int fin(int a){
if(fa[a]!=a)fa[a]=fin(fa[a]);
return fa[a];
}
void uni(int a,int b){
fa[a]=fin(a);
fa[b]=fin(b);
fa[fa[a]]=fa[b];
}
int RIOLU(){
freopen("basicgraph.in","r",stdin);
freopen("basicgraph.out","w",stdout);
int i,l,r;
scanf("%d",&n);
for(i=1;i<=n;i++)
{scanf("%d",&a[i]);f[i][0][0]=f[i][0][1]=a[i];}
RMQ();
for(i=1;i<=n;i++)fa[i]=i;
scanf("%d",&m);
for(i=1;i<=m;i++){
scanf("%d %d",&l,&r);
uni(rm(l,r,0),rm(l,r,1));
}
scanf("%d",&m);
for(i=1;i<=m;i++){
scanf("%d %d",&l,&r);
if(fin(l)==fin(r))printf("YES\n");
else printf("NO\n");
}
return 0;
}
int RN=RIOLU();
int main(){;}