记录编号 9671 评测结果 AAAAAAAAAA
题目名称 延绵的山峰 最终得分 100
用户昵称 GravatarBYVoid 是否通过 通过
代码语言 C++ 运行时间 1.697 s
提交时间 2009-04-10 21:02:39 内存使用 4.08 MiB
显示代码纯文本
/* 
 * Problem: 延绵的山峰 climb
 * Author: Guo Jiabao
 * Time: 2009.4.10 21:01
 * State: 
 * Memo: Segment Tree
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#define MAXN 1000001
using namespace std;
int S[MAXN];
struct node
{
	node *left,*right;
	int a,b;
	int v;
	node(int ta,int tb)
	{
		a=ta;b=tb;
		left=right=0;
	}
};
struct segmenttree
{
	int size;
	node *root;
	inline int max(int a,int b){return a>b?a:b;}
	void create(node *N,int A,int B)
	{
		if (A==B)
		{
			N->v=S[A];
			return;
		}
		int M=(A+B)/2;
		N->left=new node(A,M);
		create(N->left,A,M);
		N->right=new node(M+1,B);
		create(N->right,M+1,B);
		N->v=max(N->left->v,N->right->v);
	}
	segmenttree(int n)
	{
		size=n;
		root=new node(0,size);
		create(root,0,size);
	}
	int _get(node *N,int a,int b)
	{
		if (a==N->a && b==N->b)
			return N->v;
		int M=(N->a+N->b)/2;
		if (b<=M)return _get(N->left,a,b);
		if (a>=M+1)return _get(N->right,a,b);
		int V1,V2;
		V1=_get(N->left,a,M);
		V2=_get(N->right,M+1,b);
		return max(V1,V2);
	}
	int get(int a,int b)
	{
		return _get(root,a,b);
	}
};
segmenttree *T;
int N;
void init()
{
	freopen("climb.in","r",stdin);
	freopen("climb.out","w",stdout);
	int i;
	scanf("%d",&N);
	for (i=0;i<=N;i++)
		scanf("%d",&S[i]);
	T=new segmenttree(N);
}
void answer()
{
	int i,Q,a,b,v;
	scanf("%d",&Q);
	for (i=1;i<=Q;i++)
	{
		scanf("%d%d",&a,&b);
		v=T->get(a,b);
		printf("%d\n",v);
	}
}
int main()
{
	init();
	answer();
	return 0;
}