#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long LL;
const int N=1e5+10;
int n,m,a[N];
LL tree1[N],tree2[N];
int lowbit(int x){
return x&-x;
}
void insert(LL tree[],int x,LL k){
while(x<=n){
tree[x]+=k;
x+=lowbit(x);
}
}
LL query(LL tree[],int x){
LL sum=0;
while(x){
sum+=tree[x];
x-=lowbit(x);
}
return sum;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
insert(tree1,i,a[i]-a[i-1]);
insert(tree2,i,(i-1)*(a[i]-a[i-1]));
}
int op,x,y;
LL k;
while(m--){
scanf("%d%d%d",&op,&x,&y);
if(op==1){
scanf("%llu",&k);
insert(tree1,x,k);
insert(tree1,y+1,-k);
insert(tree2,x,(x-1)*k);
insert(tree2,y+1,-y*k);
}else printf("%llu\n",y*query(tree1,y)-query(tree2,y)-(x-1)*query(tree1,x-1)+query(tree2,x-1));
}
return 0;
}