首页 > 代码库 > HDU 1754 I Hate It 线段树单点更新求最大值

HDU 1754 I Hate It 线段树单点更新求最大值

题目链接

线段树入门题,线段树单点更新求最大值问题。

 

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define N 200005
using namespace std;
int data[N];
struct Tree
{
    int l,r,ans;
}tree[N*4];
void build(int root,int l,int r)
{
    tree[root].l=l;
    tree[root].r=r;
    if(l==r)
    {
        tree[root].ans=data[l];
        return;
    }
    int mid=(l+r)>>1;
    build(root<<1,l,mid);
    build(root<<1|1,mid+1,r);
    tree[root].ans=max(tree[root<<1].ans,tree[root<<1|1].ans);
}
void update(int root,int pos,int val)
{
    if(tree[root].l==tree[root].r)
    {
        tree[root].ans=val;
        return;
    }
    int mid=(tree[root].l+tree[root].r)>>1;
    if(pos<=mid) update(root<<1,pos,val);
    else update(root<<1|1,pos,val);
    tree[root].ans=max(tree[root<<1].ans,tree[root<<1|1].ans);
}
int query(int root,int l,int r)
{
    if(l<=tree[root].l&&r>=tree[root].r) return tree[root].ans;
    int mid=(tree[root].l+tree[root].r)>>1,ret=-1;
    if(l<=mid) ret=max(query(root<<1,l,r),ret);
    if(r>mid) ret=max(query(root<<1|1,l,r),ret);
    return ret;
}
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=1;i<=n;i++)
        scanf("%d",&data[i]);
        build(1,1,N);
        int a,b;
        char c[10];
        while(m--)
        {
            scanf("%s%d%d",c,&a,&b);
            if(c[0]==Q)
            {
                if(a>b) swap(a,b);
                printf("%d\n",query(1,a,b));
            }
            else
            {
                data[a]=b;
                update(1,a,data[a]);
            }
        }
    }
    return 0;
}

 

HDU 1754 I Hate It 线段树单点更新求最大值