#include<bits/stdc++.h>
#define int long long
#define fff(i,l,r) for(int i=l;i<=r;i++)
#define ddd(i,l,r) for(int i=l;i>=r;i--)
#define pb push_back
#define mk make_pair
using namespace std;
const int N=1e5+5;
int a[N];
int n;
struct SegmentTree{
int seg[N*4],tag[N*4];
void pushdown(int p,int l,int r){
int mid=(l+r)/2;
int x=tag[p];
tag[p]=0;
tag[p*2]+=x;
tag[p*2+1]+=x;
seg[p*2]+=x*(mid-l+1);
seg[p*2+1]+=x*(r-mid);
}
void build(int l,int r,int p,int a[]){
if(l==r){
seg[p]=a[r];
return;
}
int mid=(l+r)/2;
build(l,mid,p*2,a);
build(mid+1,r,p*2+1,a);
seg[p]=seg[p*2]+seg[p*2+1];
}
void update(int l,int r,int s,int t,int p,int c){
if(l<=s&&t<=r){
seg[p]+=c*(r-l+1);
tag[p]+=c;
return;
}
int mid=(l+r)/2;
if(tag[p]!=0){
pushdown(p,l,r);
}
if(mid>=s)update(l,mid,s,t,p*2,c);
if(mid<t)update(mid+1,r,s,t,p*2+1,c);
seg[p]=seg[p*2]+seg[p*2+1];
}
int query(int l,int r,int s,int t,int p){
if(l<=s&&t<=r)return seg[p];
int mid=(l+r)/2;
if(tag[p]!=0){
pushdown(p,l,r);
}
int sum=0;
if(mid>=s)sum+=query(l,mid,s,t,p*2);
if(mid<t)sum+=query(mid+1,r,s,t,p*2+1);
return sum;
}
}s1;
signed main(){
int T;
cin>>n>>T;
fff(i,1,n)cin>>a[i];
s1.build(1,n,1,a);
while(T--){
int op,x,y,k;
cin>>op>>x>>y;
if(op==1){
cin>>k;
s1.update(1,n,x,y,1,k);
}
if(op==2)cout<<s1.query(1,n,x,y,1)<<'\n';
// fff(i,1,n*4){
// cout<<setw(3)<<i;
// }
// cout<<'\n';
// fff(i,1,n*4){
// cout<<setw(3)<<s1.seg[i];
// }
// cout<<'\n';
// fff(i,1,n*4){
// cout<<setw(3)<<s1.tag[i];
// }
// cout<<'\n';
}
return 0;
}
第一遍写过了第二遍反而过不去了,就打算写一个struct封装,调不对了,服了,唐了呀