树状数组的区间修改

 原始的树状数组只能单点更新,区间查询。

运用差分的思想引入差分数组,从而实现区间修改。

c[i]为原始的树状数组,d[i]为差分的树状数组

#include<bits/stdc++.h>
using namespace std;
int c[100010],d[100010],n,m;
int lowbit(int i)
{
    return i&(-i);    
} 
void update(int x,int y)
{
    for(int i = x;i<=n;i+=lowbit(i))
    {
        c[i]+=y;
        d[i]+=(x-1)*y;
    }
}
int getsum(int x)
{
    int sum = 0;
    for(int i = x;i>0;i-=lowbit(i))
    {
        sum+=x*c[i]-d[i];
    }
    return sum;
}
int main()
{
    int t,l,r,v;
    cin>>n>>m;
    for(int i = 1;i<=n;i++)//初始化 
    {
        cin>>t;
        update(i,t);
        update(i+1,-v);
    }
    while(m--)//m个询问 
    {
        cin>>t;
        if(t)//t等于1时区间修改 
        {
            cin>>l>>r>>v;
            update(l,v);
            update(r+1,-v);
        }
        else
        {
            cin>>l>>r;
            cout<<getsum(r)-getsum(l-1)<<endl;
        }
    }
    return 0;
}

 

posted @ 2019-08-04 09:43  logan&ever  阅读(294)  评论(0编辑  收藏  举报