记录编号 |
458430 |
评测结果 |
AAAAAAA |
题目名称 |
基本的图问题 |
最终得分 |
100 |
用户昵称 |
Fisher. |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.677 s |
提交时间 |
2017-10-11 10:50:38 |
内存使用 |
4.13 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-48;c=getchar();}
return x*f;
}
const int maxn=100010;
int n,m;
int fa[maxn];
inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int data[maxn];
int maxx[maxn<<2],minn[maxn<<2];
inline void build(int o,int l,int r){
if(l==r){
maxx[o]=minn[o]=data[l];
return ;
}
int m=(l+r)>>1,ls=o<<1,rs=ls|1;
build(ls,l,m);
build(rs,m+1,r);
maxx[o]=max(maxx[ls],maxx[rs]);
minn[o]=min(minn[ls],minn[rs]);
}
inline int findmin(int o,int l,int r,int nl,int nr){
if(l>=nl&&r<=nr)return minn[o];
int m=(l+r)>>1,ls=o<<1,rs=ls|1;
int ans=0x7fffffff;
if(m>=nl)ans=min(ans,findmin(ls,l,m,nl,nr));
if(m<nr)ans=min(ans,findmin(rs,m+1,r,nl,nr));
return ans;
}
inline int findmax(int o,int l,int r,int nl,int nr){
if(l>=nl&&r<=nr)return maxx[o];
int m=(l+r)>>1,ls=o<<1,rs=ls|1;
int ans=-0x7fffffff;
if(m>=nl)ans=max(ans,findmax(ls,l,m,nl,nr));
if(m<nr)ans=max(ans,findmax(rs,m+1,r,nl,nr));
return ans;
}
int main(){
freopen("basicgraph.in","r",stdin);
freopen("basicgraph.out","w",stdout);
n=read();
for(int i=1;i<=n;i++){
fa[i]=i;
data[i]=read();
}
build(1,1,n);
m=read();
for(int i=1;i<=m;i++){
int l=read(),r=read();
int u=findmax(1,1,n,l,r);
int v=findmin(1,1,n,l,r);
u=find(u);v=find(v);
fa[u]=v;
}
m=read();
for(int i=1;i<=m;i++){
int u=read(),v=read();
if(find(u)==find(v))puts("YES");
else puts("NO");
}
return 0;
}