比赛 |
Segment Tree Competition |
评测结果 |
AAAAAAAAAA |
题目名称 |
延绵的山峰 |
最终得分 |
100 |
用户昵称 |
ZXCVBNM_1 |
运行时间 |
0.428 s |
代码语言 |
C++ |
内存使用 |
49.91 MiB |
提交时间 |
2016-08-28 20:23:12 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000010
struct node
{
int left,right,mx;
}tree[MAXN*4];
int a[MAXN];
int read()
{
int s=0,fh=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')fh=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=s*10+(ch-'0');ch=getchar();}
return s*fh;
}
void Pushup(int k){tree[k].mx=max(tree[k*2].mx,tree[k*2+1].mx);}
void Build(int k,int l,int r)
{
tree[k].left=l;tree[k].right=r;
if(l==r){tree[k].mx=a[l];return;}
int mid=(l+r)/2;
Build(k*2,l,mid);
Build(k*2+1,mid+1,r);
Pushup(k);
}
int Query(int k,int ql,int qr)
{
if(ql<=tree[k].left&&tree[k].right<=qr)return tree[k].mx;
int mid=(tree[k].left+tree[k].right)/2;
if(qr<=mid)return Query(k*2,ql,qr);
else if(ql>mid)return Query(k*2+1,ql,qr);
else return max(Query(k*2,ql,mid),Query(k*2+1,mid+1,qr));
}
int main()
{
freopen("climb.in","r",stdin);
freopen("climb.out","w",stdout);
int n,i,m,ql,qr;
n=read();
n++;
for(i=1;i<=n;i++)a[i]=read();
Build(1,1,n);
m=read();
for(i=1;i<=m;i++)
{
ql=read()+1;qr=read()+1;
printf("%d\n",Query(1,ql,qr));
}
fclose(stdin);
fclose(stdout);
return 0;
}