比赛 线段数树状数组 评测结果 AAAAAAAAAA
题目名称 延绵的山峰 最终得分 100
用户昵称 Xiaokang_Zhao120 运行时间 0.691 s
代码语言 C++ 内存使用 19.39 MiB
提交时间 2018-06-24 11:02:38
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;

#define lson l , m , rt << 1
#define rson m+1 , r , rt << 1 | 1

const int maxn = 1000000;
int data[maxn],max_[maxn<<2];

void push_up(int rt)
{
    max_[rt]=max(max_[rt<<1] , max_[rt<<1|1]);
    return;
}
void build(int l,int r,int rt)
{
    if(l==r)
    {
        max_[rt]=data[l];
        return;
    }
    int m=(l+r) >> 1;
    build(lson);
    build(rson);
    push_up(rt);
    return;
}
/*void update(int p,int sc,int l,int r,int rt)
{
    if(l==r)
    {
        max_[rt]=sc;
        return;
    }
    int m=(l+r)>>1;
    if(p<=m)
        update(p,sc,lson);
    else
        update(p,sc,rson);
    return;
}*/
int query(int L,int R,int l,int r,int rt)
{
    if(L<=l&&r<=R)
        return max_[rt];
    int m=(l+r)>>1;
    int ret=0;
    if(L<=m)
        ret=max(ret,query(L,R,lson));
    if(R>m)
        ret=max(ret,query(L,R,rson));
    return ret;
}

int main()
{
    freopen("climb.in","r",stdin);freopen("climb.out","w",stdout);
    int n,q;
    cin>>n;
    for(int i=1;i<=n+1;i++)
        cin>>data[i];
    build(1,n,1);
    cin>>q;
    for(int i=1;i<=q;i++)
    {
        int a,b;
        cin>>a>>b;
        cout<<query(a+1,b+1,1,n,1)<<endl;
    }
    return 0;
}