hdu5443 线段树求区间最大

题目大意:给你一些水源,让你求给定区间当中的最大值。

算法思想:线段树求区间最大。

#include<iostream>
#include<cstdio>
using namespace std;

typedef struct Node
{
    int value;
    int l;
    int r;

};
Node tree[1050*4];
int a[10050];
void build_tree(int v,int l,int r)
{
    tree[v].l=l;
    tree[v].r=r;
    if(l==r)
    {
        tree[v].value=a[l];
        return;
    }
    else
    {
        int mid=(l+r)/2;
        build_tree(v*2,l,mid);
        build_tree(v*2+1,mid+1,r);
        tree[v].value=max(tree[v*2].value,tree[v*2+1].value);
    }
}
int query(int v,int l,int r)
{
    if(tree[v].l==l&&tree[v].r==r)
    {
        return tree[v].value;
    }

    int mid=(tree[v].l+tree[v].r)/2;
    if(r<=mid)
    {
        query(v*2,l,r);
    }
    else
    {
        if(l>mid)
            query(v*2+1,l,r);
        else
        {
            int max1=query(v*2,l,mid);
            int max2=query(v*2+1,mid+1,r);
            return max(max1,max2);
        }
    }


}
void update(int v,int add,int p)
{
    if(tree[v].l==tree[v].r)
    {
        tree[v].value+=add;
        return;
    }
    int mid=(tree[v].l+tree[v].r)/2;

    if(p<=mid)
        update(v*2,add,p);
    else
        update(v*2+1,add,p);
    tree[v].value=tree[v*2].value+tree[v*2+1].value;


}
int t,n,q;
int main()
{
    scanf("%d",&t);
    while(t--)
    {

        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        build_tree(1,1,n);
        scanf("%d",&q);
        int l,r;
        for(int i=1;i<=q;i++)
        {
            scanf("%d%d",&l,&r);
            int ans=query(1,l,r);
            printf("%d\n",ans);
        }

    }

    return 0;

}

猜你喜欢

转载自huyifan951124.iteye.com/blog/2324242
今日推荐