树状数组区间加法更新板子

#include<bits/stdc++.h>
#define read(x) scanf("%d",&x)
using namespace std;
const int N=1e6+7;
struct BIT
{
    int a[N];
    void modify(int pos,int v)
    {
        for(int i=pos;i<N;i+=i&-i)
            a[i]+=v;
    }
    int query(int pos)
    {
        int ans=0;
        for(int i=pos;i>0;i-=i&-i)
            ans+=a[i];
        return ans;
    }
}bit0,bit1;
void updata(int l,int r,int x)
{
    bit0.modify(l,-x*(l-1));
    bit0.modify(r+1,x*r);
    bit1.modify(l,x);
    bit1.modify(r+1,-x);
}
int get_sum(int l,int r)
{
    int ansl=bit1.query(l-1)*(l-1)+bit0.query(l-1);
    int ansr=bit1.query(r)*r+bit0.query(r);
    return ansr-ansl;
}
int n,q;
int main()
{
    read(n); read(q);
    for(int i=1;i<=n;i++)
    {
        int x; read(x);
        bit0.modify(i,x);
    }
    while(q--)
    {
        int op;
        read(op);
        if(op==1)
        {
            int l,r,x;
            read(l); read(r); read(x);
            updata(l,r,x);
        }
        else
        {
            int l,r;
            read(l); read(r);
            printf("%d\n",get_sum(l,r));
        }
    }
    return 0;
}

 

posted @ 2018-02-05 14:08  NotNight  阅读(151)  评论(0编辑  收藏  举报