记录编号 166149 评测结果 AAAAAAAAAA
题目名称 延绵的山峰 最终得分 100
用户昵称 Gravatar一個人的雨 是否通过 通过
代码语言 C++ 运行时间 0.516 s
提交时间 2015-06-14 11:23:35 内存使用 38.46 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
using namespace std;
struct TREE{
	int sum;
	int l;
	int r;
	TREE *lc,*rc;
	TREE():sum(-0x7f){}
};

int n,m,a[10000000];
int ans;

void build(TREE *p,int l,int r){
	//cout<<l<<" "<<r<<endl;
	p->l=l;
	p->r=r;
	if (l+1==r)
	{
		p->sum=a[l];
		p->lc=NULL;
		p->rc=NULL;
		return;
	}
	else if (l+1<r)
	{
		p->lc=new TREE;
		p->rc=new TREE;
		build(p->lc,l,(l+r)/2);
		build(p->rc,(l+r)/2,r);
		p->sum=max(p->lc->sum,p->rc->sum);
		return;
	}
	return;
}

int Q(TREE*p,int l,int r)
{
	if (l<=p->l&&p->r<=r)
	 return ans=max(ans,p->sum);
	else
	{
		if (l<(p->l+p->r)/2)
		 ans=max(ans,Q(p->lc,l,r));
		if (r>(p->l+p->r)/2)
		 ans=max(ans,Q(p->rc,l,r));
		return ans;
	}
}

int main()
{
	freopen("climb.in","r",stdin);
	freopen("climb.out","w",stdout);
	TREE *root=new TREE;
	scanf("%d",&n);
	for (int i=1;i<=n+1;++i)
	 scanf("%d",&a[i]);
	build(root,1,n+2);
	scanf("%d",&m);
	int x,y;
	for (int i=1;i<=m;++i)
	{
		scanf("%d%d",&x,&y);
		ans=-0x7f;
		if (x==y) printf("%d\n",a[x+1]);
		else
		 printf("%d\n",Q(root,x+1,y+2));
	}
}