#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); } } }
原文:https://www.cnblogs.com/qq1415584788/p/14662080.html