#include<bits/stdc++.h>
using namespace std;
#define N 200005
#define int long long
int n,m,a[N];
struct node{int num,lazy;}tr[N<<2];
inline void pushup(int x){tr[x].num=tr[x<<1].num+tr[x<<1|1].num;}
inline void pushdown(int x,int l,int r){
if(tr[x].lazy==0) return ;
int mid=(l+r)>>1;
tr[x<<1].lazy+=tr[x].lazy;
tr[x<<1|1].lazy+=tr[x].lazy;
tr[x<<1].num+=(mid-l+1)*tr[x].lazy;
tr[x<<1|1].num+=(r-mid)*tr[x].lazy;
tr[x].lazy=0;
return ;
}
void build(int x,int l,int r){
if(l==r){
tr[x].num=a[l];
return ;
}
int mid=(l+r)>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(x);
return ;
}
void edit(int x,int l,int r,int ql,int qr,int d){
if(r<ql||l>qr) return ;
if(ql<=l&&r<=qr){
tr[x].num+=d*(r-l+1);
tr[x].lazy+=d;
return ;
}
int mid=(r+l)>>1;
if(ql<=mid) edit(x<<1,l,mid,ql,qr,d);
if(qr>mid) edit(x<<1|1,mid+1,r,ql,qr,d);
pushup(x);
return ;
}
int query(int x,int l,int r,int ql,int qr){
pushdown(x,l,r);
if(r<ql||l>qr) return 0;
if(ql<=l&&r<=qr){return tr[x].num;}
int ret=0;
int mid=(l+r)>>1;
if(ql<=mid) ret+=query(x<<1,l,mid,ql,qr);
if(qr>mid) ret+=query(x<<1|1,mid+1,r,ql,qr);
return ret;
}
int reada(){
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
signed main(){
n=reada();m=reada();
for(int i=1;i<=n;i++) a[i]=reada();
build(1,1,n);
int op,ql,qr,k;
for(int i=1;i<=m;i++){
op=reada();
if(op==1){
ql=reada();qr=reada();k=reada();
edit(1,1,n,ql,qr,k);
}
if(op==2){
ql=reada(),qr=reada();
printf("%lld\n",query(1,1,n,ql,qr));
}
}
return 0;
}