线段树+

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn=1e5+10;
int a[maxn<<4],lz[maxn];
void build(int k,int l,int r){
    if(l==r){
        cin>>a[k];return ;
    }
    int mid=l+r>>1;
    build(k<<1,l,mid);
    build(k<<1|1,mid+1,r);
    a[k]=a[k<<1]+a[k<<1|1];
}
void push_down(int k,int l,int r){
    if(lz[k]){
        lz[k<<1]+=lz[k];
        lz[k<<1|1]+=lz[k];
        int mid=l+r>>1;
        a[k<<1]+=1ll*(mid-l)*lz[k];
        a[k<<1|1]+=1ll*(r-mid+1)*lz[k];
        lz[k]=0;
    }
}
void updata(int k,int l,int r,int L,int R,int add){
    if(l<=L&&r>=R){
        a[k]+=(R-L+1)*add;
        lz[k]+=add;
        return ;
    }
    push_down(k,L,R);
    int mid=L+R>>1;
    if(l<=mid)
        updata(k<<1,l,r,L,mid,add);
    if(r>mid)
        updata(k<<1|1,l,r,mid+1,R,add);
    a[k]=a[k<<1]+a[k<<1|1];
}
ll query(int k,int l,int r,int L,int R){
    if(l<=L&&r>=R)return a[k];
    push_down(k,L,R);
    int mid=L+R>>1;
    ll sum=0;
    if(l<=mid)
        sum+=query(k<<1,l,r,L,mid);
    if(r>mid)
        sum+=query(k<<1|1,l,r,mid+1,R);
    return sum;
}
int main()
{
    int n,k;
    cin>>n>>k;build(1,1,n);
    while(k--){
        int q,l,r,add;cin>>q;
        if(q==1){//区间查询
            cin>>l>>r;
            cout<<query(1,l,r,1,n)<<endl;
        }
        else{//区间修改
            cin>>l>>r>>add;
            updata(1,l,r,1,n,add);
        }
    }
}

 

posted @ 2021-04-15 13:33  Acception  阅读(34)  评论(0)    收藏  举报