树状数组区间修改区间查询

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
long long num[200050];
long long c[200050];
long long c2[200050];
long long n,q;
long long lowbit(long long i)
{
    return i&(-i);
}
void add(long long *r,long long i,long long a)
{
    for(i; i<=n; i+=lowbit(i))
    {
        r[i]+=a;
    }
    return;
}
long long sum(long long *r,long long i)
{
    long long he=0;
    for(i; i>0; i-=lowbit(i))
    {
        he+=r[i];//cout<<"++"<<endl;
    }
    return he;
}
int main()
{

    scanf("%lld",&n);
    num[0]=0;
    for(int i=1; i<=n; i++)
    {
        scanf("%lld",&num[i]);
    }
    for(int i=1; i<=n; i++)
    {
        add(c,i,num[i]-num[i-1]);
        add(c2,i,(i-1)*(num[i]-num[i-1]));
    }
    long long k,x,y,val,sum1,sum2;
    scanf("%lld",&q);
    for(int i=0; i<q; i++)
    {
        scanf("%lld",&k);
        if(k==1)
        {
            scanf("%lld%lld%lld",&x,&y,&val);
            add(c,x,val);
            add(c,y+1,-val);
            add(c2,x,(x-1)*val);
            add(c2,y+1,y*(-val));
        }
        else if(k==2)
        {
            scanf("%lld%lld",&x,&y);
            sum1=(x-1)*sum(c,x-1)-sum(c2,x-1);
            sum2=y*sum(c,y)-sum(c2,y);
            printf("%lld\n",sum2-sum1);
        }

    }
}

猜你喜欢

转载自blog.csdn.net/zyy_1998/article/details/78690709