记录编号 348408 评测结果 AAAAAAA
题目名称 基本的图问题 最终得分 100
用户昵称 Gravatarミント 是否通过 通过
代码语言 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;
}