比赛 |
区间问题练习 |
评测结果 |
AAAAAAAAAA |
题目名称 |
延绵的山峰 |
最终得分 |
100 |
用户昵称 |
REALIZE_BEYOND |
运行时间 |
0.295 s |
代码语言 |
C++ |
内存使用 |
11.74 MiB |
提交时间 |
2017-04-21 20:22:47 |
显示代码纯文本
#include<cstdio>
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 build(int o,int L,int R)
{
if(L == R){
maxv[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)
{
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()
{
freopen("climb.in","r",stdin);
freopen("climb.out","w",stdout);
scanf("%d",&n);
for(int i =1;i <=n+1;i ++)scanf("%d",&H[i]);
build(1,1,n+1);
scanf("%d",&q);
for(int i =1;i <=q;i++)
{
scanf("%d%d",&qL,&qR);
qL++;qR++;
printf("%d\n",query(1,1,n+1));
}
return 0;
}