#include<iostream>
using namespace std;
#define ll long long
const int N=1e5+10;
int n,m,op,x,y,k;
ll a[N];
struct node{
int L,R;
ll w,tag;
}tree[4*N];
void pushup(int u){
tree[u].w=tree[u*2].w+tree[u*2+1].w;
}
void build(int u,int l,int r){
if(l==r){
tree[u].w=a[l];
return;
}
int mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
pushup(u);
}
bool InRange(int L,int R,int l,int r){
return(l<=L)&&(R<=r);
}
bool OutRange(int L,int R,int l,int r){
return (L>r)||(R<l);
}
void maketag(int u,int len,ll x){
tree[u].tag+=x;
tree[u].w+=len*x;
}
void pushdown(int u,int l,int r){
int mid=(l+r)/2;
maketag(u*2,mid-l+1,tree[u].tag);
maketag(u*2+1,r-mid,tree[u].tag);
tree[u].tag=0;
}
ll query(int u,int L,int R,int l,int r){
if(InRange(L,R,l,r)){
return tree[u].w;
}
else if(!OutRange(L,R,l,r)){
int mid=(l+r)/2;
pushdown(u,L,R);
return query(u*2,L,mid,l,r)+query(u*2+1,mid+1,R,l,r);
}
else{
return 0;
}
}
void update(int u,int L,int R,int l,int r,ll x){
if(InRange(L,R,l,r)){
maketag(u,R-L+1,x);
}
else if(!OutRange(L,R,l,r)){
int mid=(L+R)/2;
pushdown(u,L,R);
update(u*2,L,mid,l,r,x);
update(u*2+1,mid+1,R,l,r,x);
pushup(u);
}
return;
}
int main(){
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
cin>>op;
if(op==1){
cin>>x>>y>>k;
update(1,1,n,x,y,k);
}
else{
cin>>x>>y;
cout<<query(1,1,n,x,y)<<endl;
}
}
return 0;
}