比赛 区间问题练习 评测结果 AAAAAAAAAA
题目名称 延绵的山峰 最终得分 100
用户昵称 kZime 运行时间 0.187 s
代码语言 C++ 内存使用 187.23 MiB
提交时间 2017-04-21 18:28:50
显示代码纯文本
#include <iostream>
#include <cstdio>
#define MAXN 1000000
#define lc i*2
#define rc i*2+1
using namespace std;
struct segtree{
	int l,r,m;
}nd[MAXN<<4];
int n,q,a[MAXN];
inline int read(){
    int k=0;char f=1,c=getchar();
    for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
    for(;isdigit(c);c=getchar())k=k*10+c-'0';
    return k*f;
}
void build(int i,int left,int right){
	nd[i].l=left;
	nd[i].r=right;
	if(left==right){
		nd[i].m=a[left];
		return;
	}else{
		int mid=(left+right)/2;
		build(lc,left,mid);
		build(rc,mid+1,right);
	}
	nd[i].m=max(nd[lc].m,nd[rc].m);
	return;
}
int find(int i,int left,int right){
	if(nd[i].l==left&&nd[i].r==right){
		return nd[i].m;
	}else{
		if(left>=nd[lc].l&&right<=nd[lc].r){
			return find(lc,left,right);
		}else if(left>=nd[rc].l&&right<=nd[i].r){
			return find(rc,left,right);
		}else{
			return max(find(lc,left,nd[lc].r),find(rc,nd[rc].l,right));
		}
	}
}
int main(){
	freopen("climb.in","r",stdin);
	freopen("climb.out","w",stdout);
	n=read();
	for(int i=0;i<=n;i++){
		a[i]=read();
	}
	build(1,0,n);
	q=read();
	while(q--){
		int left=read(),right=read();
		printf("%d\n",find(1,left,right));
	}
}