#include<bits/stdc++.h>
using namespace std;
const int SIZE=100005;
int n,m;
struct Tree{
int l,r;
long long sum,add;
#define l(x) t[x].l
#define r(x) t[x].r
#define sum(x) t[x].sum
#define add(x) t[x].add
}t[4*SIZE];
long long a[SIZE];
void build(int p,int l,int r){
l(p)=l,r(p)=r;
if(l==r){
sum(p)=a[l];
return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
sum(p)=sum(p<<1)+sum(p<<1|1);
}
void spread(int p){
if(add(p)){
sum(p<<1)+=add(p)*(r(p<<1)-l(p<<1)+1);
sum(p<<1|1)+=add(p)*(r(p<<1|1)-l(p<<1|1)+1);
add(p<<1)+=add(p);
add(p<<1|1)+=add(p);
add(p)=0;
}
}
void change(int p,int l,int r,long long x){
if(l<=l(p)&&r(p)<=r){
add(p)+=x;
sum(x)+=(long long)x*(r(p)-l(p)+1);
return;
}
spread(p);
int mid=(l(p)+r(p))>>1;
if(l<=mid){
change(p<<1,l,r,x);
}
if(r>mid){
change(p<<1|1,l,r,x);
}
sum(p)=sum(p<<1)+sum(p<<1|1);
}
long long ask(int p,int l,int r){
if(l<=l(p)&&r>=r(p)) return sum(p);
spread(p);
int mid=(l(p)+r(p))>>1;
long long val=0;
if(l<=mid) val+=ask(p<<1,l,r);
if(mid<r) val+=ask(p<<1|1,l,r);
return val;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,1,n);
while(m--){
int op;
int l,r,d;
scanf("%d%d%d",&op,&l,&r);
if(op==1){
scanf("%d",&d);
change(1,l,r,d);
continue;
}
printf("%lld\n",ask(1,l,r));
}
return 0;
}