51nod1174【基于线段树的RMQ】

很基础啊~

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;

const int INF=-0x3f3f3f3f;
const int N=1e4+10;

struct asd{
    int left;
    int right;
    int w;
};
asd q[N*4];

void Build(int num,int L,int R)
{
    q[num].left=L;
    q[num].right=R;
    if(L==R)
    {
        scanf("%d",&q[num].w);
        return;
    }
    Build(2*num,L,(L+R)/2);
    Build(2*num+1,(L+R)/2+1,R);
    q[num].w=max(q[2*num].w,q[2*num+1].w);
}

int query(int num,int s,int t)
{
    if(s<=q[num].left&&t>=q[num].right)
        return q[num].w;
    if(q[num].right==q[num].left)
        return q[num].w;

    int mid=(s+t)/2;
    if(mid>=t)
        return query(2*num,s,t);
    else if(mid<s)
        return query(2*num+1,s,t);
    else
        return max(query(2*num,s,mid),query(2*num+1,mid+1,t));
}

int get_maxa(int num,int s,int t)
{
    if(s<=q[num].left&&t>=q[num].right)
        return q[num].w;

    int mid=(q[num].left+q[num].right)/2;
    if(mid>=t)
        return get_maxa(2*num,s,t);
    else if(mid<s)
        return get_maxa(2*num+1,s,t);
    else
        return max(get_maxa(2*num,s,mid),get_maxa(2*num+1,mid+1,t));
}

int main()
{
    int x,y,n,q;
    scanf("%d",&n);
    Build(1,1,n);
    scanf("%d",&q);
    while(q--)
    {
        scanf("%d%d",&x,&y);
        printf("%d
",get_maxa(1,x+1,y+1));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934808.html