![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<algorithm> 2 #include<cstdio> 3 using namespace std; 4 typedef long long ll; 5 const ll N=1e5+10,INF=0x3f3f3f3f; 6 ll n,m; 7 ll sum[N],t[N<<2],tag[N<<2],ans[N<<2]; 8 inline ll ls(ll p){return p<<1;} 9 inline ll rs(ll p){return p<<1|1;} 10 inline void push_up(ll p){ans[p]=ans[ls(p)]+ans[rs(p)];} 11 inline void add(ll l,ll r,ll p,ll k){ans[p]+=k*(r-l+1);tag[p]+=k;} 12 inline ll read(){ 13 ll x=0,f=1;char ch=getchar(); 14 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 15 while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); 16 return x*f; 17 } 18 inline void scan(){ 19 n=read();m=read(); 20 for(ll i=1;i<=n;i++)sum[i]=read(); 21 } 22 void build(ll p,ll l,ll r){ 23 if(l==r){ 24 ans[p]=sum[l];return; 25 } 26 ll mid=(l+r)>>1; 27 build(ls(p),l,mid); 28 build(rs(p),mid+1,r); 29 push_up(p); 30 } 31 void push_down(ll l,ll r,ll p){ 32 ll mid=(l+r)>>1; 33 add(l,mid,ls(p),tag[p]); 34 add(mid+1,r,rs(p),tag[p]); 35 tag[p]=0; 36 } 37 void update(ll cl,ll cr,ll l,ll r,ll p,ll k){ 38 if(cl<=l&&cr>=r){ 39 add(l,r,p,k);return; 40 } 41 ll mid=(l+r)>>1; 42 push_down(l,r,p); 43 if(cl<=mid)update(cl,cr,l,mid,ls(p),k); 44 if(cr>mid)update(cl,cr,mid+1,r,rs(p),k); 45 push_up(p); 46 } 47 ll query(ll cl,ll cr,ll l,ll r,ll p){ 48 ll res=0; 49 if(cl<=l&&cr>=r)return ans[p]; 50 ll mid=(l+r)>>1; 51 push_down(l,r,p); 52 if(cl<=mid)res+=query(cl,cr,l,mid,ls(p)); 53 if(cr>mid)res+=query(cl,cr,mid+1,r,rs(p)); 54 return res; 55 } 56 int main(){ 57 // freopen("testdata.in","r",stdin); 58 // freopen("testdata.out","w",stdout); 59 scan(); 60 build(1,1,n); 61 while(m--){ 62 ll k=read(); 63 if(k==1){ 64 ll l=read(),r=read(),k=read(); 65 update(l,r,1,n,1,k); 66 } 67 else { 68 ll l=read(),r=read(); 69 printf("%lld ",query(l,r,1,n,1)); 70 } 71 } 72 return 0; 73 }