记录编号 |
348408 |
评测结果 |
AAAAAAA |
题目名称 |
基本的图问题 |
最终得分 |
100 |
用户昵称 |
ミント |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.084 s |
提交时间 |
2016-11-14 10:16:27 |
内存使用 |
14.67 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn = 100000 + 100;
class UFS{
public:
int fa[maxn];
void init(int n){for(int i=0;i<=n;i++)fa[i] = i;}
int find(int x){return fa[x]==x?fa[x]:fa[x] = find(fa[x]);}
bool merge(int x, int y){
int fx = find(x), fy = find(y);
if(fx==fy)return true;
fa[fx] = fy;return false;
}
}ufs;
int st[maxn][21][2];
int n, arr[maxn];
void buildST(int n){
for(int i=1;i<=n;i++)st[i][0][0] = st[i][0][1] = arr[i];
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i+(1<<j)-1<=n;i++){
st[i][j][0] = max(st[i][j-1][0], st[i+(1<<(j-1))][j-1][0]);
st[i][j][1] = min(st[i][j-1][1], st[i+(1<<(j-1))][j-1][1]);
}return ;
}
inline int queryST(int flag, int l, int r){
int k = log(r-l+1.0) / log(2.0);
if(flag==0)return max(st[l][k][flag], st[r-(1<<k)+1][k][flag]);
else return min(st[l][k][flag], st[r-(1<<k)+1][k][flag]);
}
int main(){
freopen("basicgraph.in", "r", stdin);
freopen("basicgraph.out", "w", stdout);
cin>>n;
for(int i=1;i<=n;i++)cin>>arr[i];
buildST(n);ufs.init(n+10);
int m;cin>>m;
for(int i=1;i<=m;i++){
int a, b;cin>>a>>b;
int mx = queryST(0, a, b), mn = queryST(1, a, b);
ufs.merge(mx, mn);
}
int k;cin>>k;
while(k--){
int u, v;cin>>u>>v;
if(ufs.find(u)==ufs.find(v))cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}