#include<bits/stdc++.h>
#define int long long
#define maxn 100005
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define fr(i,x,y) for(int i=(x);i<=(y);i++)
using namespace std;
int tree[maxn<<2],tag[maxn<<2];
int num[maxn],n,m;
int build(int l,int r,int id){
if (l==r) return tree[id]=num[l];
int mid=(l+r)>>1;
build(l,mid,ls(id));
build(mid+1,r,rs(id));
return tree[id]=tree[ls(id)]+tree[rs(id)];
}
void addtag(int p,int x,int y,int k){
tag[p]+=k;
tree[p]+=k*(y-x+1);
}
void pushdown(int p,int x,int y){
if (tag[p]){
int mid=(x+y)>>1;
addtag(ls(p),x,mid,tag[p]);
addtag(rs(p),mid+1,y,tag[p]);
tag[p]=0;
}
}
void update(int l,int r,int id,int x,int y,int k){
if (l<=x && r>=y){ addtag(id,x,y,k); return; }
pushdown(id,l,r);
int mid=(l+r)>>1;
update(l,mid,ls(id),x,y,k);
update(mid+1,r,rs(id),x,y,k);
tree[id]=tree[ls(id)]+tree[rs(id)];
}
int query(int l,int r,int x,int y,int id){
if (x<=l && y>=r) return tree[id];
pushdown(id,l,r);
int mid=(l+r)>>1,p=0;
if (x<=mid) p+=query(l,mid,x,y,ls(id));
if (y>mid) p+=query(mid+1,r,x,y,rs(id));
return p;
}
signed main(){
int n,m;
scanf("%lld%lld",&n,&m);
fr(i,1,n) scanf("%lld",&num[i]);
build(1,n,1);
int op,x,y,k;
fr(i,1,m){
scanf("%lld",&op);
if (op==1){
scanf("%lld%lld%lld",&x,&y,&k);
update(1,n,1,x,y,k);
}else{
scanf("%lld%lld",&x,&y);
printf("%lld\n",query(1,n,x,y,1));
}
}
return 0;
}