hdu1754

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754

线段树单点更新区间求最大值,把原来的区间求和改为求子节点的最大值就可以了。

#include 
#include
#include
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn=2e6;
int sum[maxn<<2];
void Pushup(int rt)
{
    sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
}
void build(int l,int r,int rt)
{
    if(l==r)
    {
        scanf("%d",&sum[rt]);
        return;
    }
    int m=(l+r)>>1;
    build(lson);
    build(rson);
    Pushup(rt);
}
void update(int p,int add,int l,int r,int rt)
{
    if(l==r)
    {
        sum[rt]=add;
        return ;
    }
    int m=(l+r)>>1;
    if(p<=m)update(p,add,lson);
     else   update(p,add,rson);

    Pushup(rt);
}
int query(int L,int R,int l,int r,int rt)
{
    if(L<=l&&R>=r)
    {
        return sum[rt];
    }
    int m=(l+r)>>1;
    int ret=0;
    if(m>=L) ret=max(ret,query(L,R,lson));
    if(m


你可能感兴趣的:(线段树)