比赛 Segment Tree Competition 评测结果 AAAAAAAATT
题目名称 延绵的山峰 最终得分 80
用户昵称 洛克索耶夫 运行时间 2.265 s
代码语言 C++ 内存使用 89.56 MiB
提交时间 2016-08-28 19:03:47
显示代码纯文本
#include<bits/stdc++.h>
 
int n,q;
int rmax[1000200][25],a[1000200];
 
inline int GetMax(const int& a, const int& b)
{
	return a>b?a:b;
}
 
int Read()
{
	int a=0;
	char ch=getchar();
	while(ch<'0'||ch>'9')	ch=getchar();
	while(ch>='0'&&ch<='9'){
		a=a*10+ch-'0';
		ch=getchar();
	}
	return a;
}
 
void RmqInit()
{
	int m=log(n*1.0)/log(2.0);
	//换底公式,因为log(a)默认是以e为底a的对数
	//loga(b)=logc(b)/logc(a) 
	//log2(8)=ln(8)/ln(2) 
	for(int j=1;j<=m;j++){
		for(int i=1;i<=n;i++){
			rmax[i][j]=rmax[i][j-1];
			int k=1<<(j-1);	
			if(i+k<=n){
				rmax[i][j]=GetMax(rmax[i][j-1],rmax[i+k][j-1]);
				//类似动规 
			}	
		}
	}
}
 
inline int RmqMax(const int& s, const int& t)
{
	int m=log((t-s+1)*1.0)/log(2.0);
	int k=1<<m;
	return GetMax(rmax[s][m],rmax[t-k+1][m]);
	//中间可以有部分重复 
} 
 
void Init()
{
	n=Read();
	for(int i=1;i<=n+1;i++){
		a[i]=Read();
		rmax[i][0]=a[i];
		//rmax[i][j]:从i开始,长度为2的j次方的一段元素的最值 
	}
	RmqInit();
	q=Read();
	int s,t;
	for(int i=1;i<=q;i++){
		s=Read(),t=Read();
		printf("%d\n",RmqMax(s+1,t+1));
	}
}
 
int main()
{
	freopen("climb.in","r",stdin);
	freopen("climb.out","w",stdout);
	Init();
	return 0;
}