51nod1174【基于线段树的RMQ】

来源:互联网 发布:开启手机休眠关闭网络 编辑:程序博客网 时间:2024/05/17 01:42

很基础啊~

#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\n",get_maxa(1,x+1,y+1));    }    return 0;}
0 0
原创粉丝点击