比赛 区间问题练习 评测结果 AAAAAAAAAA
题目名称 延绵的山峰 最终得分 100
用户昵称 Hyoi_iostream 运行时间 0.299 s
代码语言 C++ 内存使用 11.76 MiB
提交时间 2017-04-21 19:58:24
显示代码纯文本
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=1e6+100;
const int inf=10000;
FILE*fin,*fout;
int n,q,H[maxn];
int maxv[2*maxn],qL,qR;
inline int max(int a,int b){return a<b?b:a;}
void update(int o,int p,int v,int L,int R){
	//A[P]=v;
	int M=L+(R-L)/2;
	if(L==R) maxv[o]=v;//叶节点,直接更新
	else{
		if(p<=M) update(o*2,p,v,L,M);
		else update(o*2+1,p,v,M+1,R);
		maxv[o]=max(maxv[o*2],maxv[o*2+1]);
	} 
}
void build(int o,int L,int R){
	if(L==R){
		maxv[o]=H[L];
		//fprintf(fout,"o=%d,L=%d,R=%d,maxv[%d]=%d\n",o,L,R,o,H[L]);
		return ;
	}
	else{
		int M=L+(R-L)/2;
		build(o*2,L,M);
		build(o*2+1,M+1,R);
		maxv[o]=max(maxv[o*2],maxv[o*2+1]);
	}
}
int query(int o,int L,int R){
	//fprintf(fout,qL=%d,qR=%d,o=%d,L=%d,R=%d\n",qL,qR,o,,L,R);
	if(R<qL||L>qR) return 0;
	int ans=0,M=L+(R-L)/2;
	if(L>=qL&&R<=qR) return maxv[o];
	if(M>=qL) ans=max(ans,query(o*2,L,M));
	if(M<qR) ans=max(ans,query(o*2+1,M+1,R));
	return ans;
}
int main(){
	fin=fopen("climb.in","r");
	fout=fopen("climb.out","w");
	//fout=stdout;
	fscanf(fin,"%d",&n);
	for(int i=1;i<=n+1;i++) fscanf(fin,"%d",&H[i]);
	build(1,1,n+1);
	fscanf(fin,"%d",&q);
	for(int i=1;i<=q;i++){
		fscanf(fin,"%d%d",&qL,&qR);
		qL++;qR++;
		fprintf(fout,"%d\n",query(1,1,n+1)); 
	}
	return 0;
}