线段树单点修改


//单点修改 区间求和
#define Max 41234
int ans;int data[Max],sum[4*Max];
void creat(int l,int r,int root)
{
    if(l==r)
        {
            sum[root]=data[l];//更新叶子节点
            return ;
        }
    int mid=(l+r)/2;
    creat(l,mid,root*2);
    creat(mid+1,r,root*2+1);
    sum[root]=sum[root*2]+sum[root*2+1];//更新父亲节点
}
void update(int L,int c,int l,int r,int root)
{
    if(l==r)
        {
            sum[root]+=c;
            return ;
        }
    int mid=(l+r)/2;
    if(L<=mid)
        update(L,c,l,mid,root*2);
    else
        update(L,c,mid+1,r,root*2+1);
    sum[root]=sum[root*2]+sum[root*2+1];
}
void Query(int L,int R,int l,int r,int root)
{
    if(L<=l&&R>=r)
    {
        ans+=sum[root];
        return;
    }
    int mid=(l+r)/2;
    if(L<=Mid)
        Query(L,R,l,r,root*2);
    if(R>mid)
        Query(L,R,l,r,root*2+1);
}

//单点修改 区间找最值
void creat(int l,int r,int root)
{
    if(l==r)
    {
        sum[root]=data[i];
        return ;
    }
    int mid=(l+r)/2;
    creat(l,mid,root*2);
    creat(mid+1,r,root*2+1);
    sum[root]=max(sum[root*2],sum[root*2+1])//最小也一样
}
void update(int L,int c,int l,int r,int root)
{
    if(l==r)
    {
        sum[root]=c;
        return;
    }
    int mid=(l+r)/2;
    if(L<=mid)
        update(L,c,l,mid,root*2);
    else
        update(L,c,mid+1,r,root*2+1);
    sum[root]=max(sum[root],sum[root*2+1]);
}
void Query(int L,int R,int l,int r,int root)
{
    if(L<=l&&R>=r)
    {
        ans=max(ans,sum[root]);
    }
    int mid=(l+r)/2;
    if(L<=mid)
        Query(L,R,l,mid,root*2);
    if(R>mid)
        Query(L,R,mid+1,r,root*2+1);
}
 

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