#include<bits/stdc++.h>
using namespace std;
#define MAXN 100010
#define ll long long
int n,m;
int rt,t,l,r,k;
int a[MAXN];
int sum[MAXN];
struct Segmentree{
int l,r;
long long sum,tag;
}tree[4*MAXN];
ll cal(int p){
return tree[p].sum+=tree[p].tag*(tree[p].r-tree[p].l+1);
}
void push_up(int p){
tree[p].sum=cal(2*p)+cal(2*p+1);
}
void push_down(int p){
if(tree[p].tag==0){
return;
}
tree[2*p].tag+=tree[p].tag;
tree[2*p+1].tag+=tree[p].tag;
tree[p].sum=cal(p);
tree[p].tag=0;
}
void change(int p,int ql,int qr,int dv){
if(ql<=tree[p].l&&qr>=tree[p].r){
tree[p].sum+=dv*(tree[p].r-tree[p].l+1);
tree[p].tag+=dv;
return;
}
push_down(p);
int mid=(tree[p].l+tree[p].r)/2;
if(qr<=mid){
change(2*p,ql,qr,dv);
}else if(ql>=mid+1){
change(2*p+1,ql,qr,dv);
}else{
change(2*p,ql,mid,dv);
change(2*p+1,mid+1,qr,dv);
}
push_up(p);
}
ll query(int p,int ql,int qr){
if(tree[p].l==ql&&tree[p].r==qr){
return cal(p);
}
}
ll build(int p,int l,int r){
tree[p].l=l;
tree[p].r=r;
if(l==r){
tree[p].sum=a[l];
return p;
}else{
int mid=(l+r)/2;
tree[p].l=build(2*p,l,mid);
tree[p].r=build(2*p+1,mid+1,r);
push_up(p);
return p;
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
rt=build(1,1,n);
for(int i=1;i<=m;i++){
cin>>t;
if(t==1){
cin>>l>>r>>k;
change(rt,l,r,k);
}else{
cin>>l>>r;
cout<<query(rt,l,r)<<endl;
}
}
return 0;
}