#include<iostream>
#include<string.h>
#include<cmath>
using namespace std;
const int N=10010;
#define LL long long
#define itn int
LL n,m;
LL a[N],tree[N*60],lazy[N*60];
void push(int pos,int l,int r) {
int son=(pos<<1),len=r-l+1;
lazy[son]+=lazy[pos];
lazy[son+1]+=lazy[pos];
tree[pos]+=lazy[pos]*len;
lazy[pos]=0;
return;
}
void add(int pos,int l,int r,int val,int vl,int vr) {
if(l==r) {
tree[pos]+=val;
return;
}
if(vl<=l&&vr>=r) {
lazy[pos]+=val;
return;
}
int mid=(l+r)>>1,son=pos<<1;
if(vl<=mid)
add(son,l,mid,val,vl,vr);
if(vr>mid)
add(son+1,mid+1,r,val,vl,vr);
tree[pos]=tree[son]+tree[son+1];
return;
}
LL ask(int pos,int l,int r,int al,int ar) {
int mid=(l+r)>>1,son=pos<<1;
if(l==r) {
return tree[pos]+lazy[pos]*(r-l+1);
}
if(al<=l&&r<=ar) {
return tree[pos]+lazy[pos]*(r-l+1);
}
push(pos,l,r);
LL ans=0;
if(al<=mid) ans+=ask(son,l,mid,al,ar);
if(ar>mid) ans+=ask(son+1,mid+1,r,al,ar);
// tree[pos]=tree[son]+tree[son+1];
return ans;
}
void build(int pos,int l,int r) {
if(l==r) {
tree[pos]=a[l];
return;
}
int mid=(l+r)>>1,son=pos<<1;
build(son,l,mid);
build(son+1,mid+1,r);
tree[pos]=tree[son]+tree[son+1];
return ;
}
int main() {
memset(tree,0,sizeof(tree));
memset(lazy,0,sizeof(lazy));
cin>>n>>m;
for(int i=1; i<=n; i++) {
scanf("%lld",&a[i]);
}
build(1,1,n);
LL opt,x,y,k;
for(int i=1; i<=m; i++) {
scanf("%lld",&opt);
if(opt==1) {
// scanf("%lld %lld %lld",&x,&y,&k);
cin>>x>>y>>k;
add(1,1,n,k,x,y);
}
if(opt==2) {
// scanf("%lld %lld",&x,&y);
cin>>x>>y;
cout<<ask(1,1,n,x,y)<<endl;
}
}
// system("pause");
return 0;
}