#include <bits/stdc++.h>
using namespace std;
const int N=100001;
int n,m,a[N],t[N];
int lazy[N];
void pushup(int k){
t[k]=t[k*2]+t[k*2+1];
}
void build(int k,int l,int r){
if(l==r){
t[k]=a[l];
return;
}
else{
int mid=(l+r)/2;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
pushup(k);
}
}
void f(int k,int l,int r,int v){
lazy[k]=lazy[k]+v;
t[k]=t[k]+v*(r-l+1);
}
void pushdown(int k,int l,int r){
int mid=(l+r)/2;
f(k/2,l,mid,lazy[k]);
f(k/2+1,mid+1,r,lazy[k]);
lazy[k]=0;
}
int update(int L,int R,int v,int l,int r,int k){
if(L<=l&&r<=R){
t[k]+=v;
lazy[k]+=v;
}else{
pushdown(k,l,r);
int mid=l+((r-l)/2);
if(l<=mid){
update(L,R,v,l,mid,k*2);
}
if(mid<r){
update(L,R,v,mid+1,r,k*2|1);
}
pushup(k);
}
}
int query(int l,int r,int L,int R,int k){
if(L<=l&&r<=R){
return t[k];
}else{
int res=0;
int mid=(l+r)/2;
pushdown(k,l,r);
if(l<=mid){
res+=query(l,mid,L,R,k*2);
}
if(mid<r){
res+=query(mid+1,r,L,R,k*2+1);
}
return res;
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
int x,y,k,quiz;
for(int i=1;i<=m;i++){
cin>>quiz;
if(quiz==1){
scanf("%d%d%d",&x,&y,&k);
update(1,n,k,x,y,1);
}
if(quiz==2){
scanf("%d%d",&x,&y);
cout<<query(x,y,1,n,1)<<'\n';
}
}
return 0;
}