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

来源:互联网 发布:施工进度网络计划软件 编辑:程序博客网 时间:2024/05/22 01:28
#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);        }    }}

原创粉丝点击