#include<bits/stdc++.h>
using namespace std;
inline long long read(){
long long x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
int lazy[400005],tree[400005],n,a[100005],m,x,y,k,z;
void built(int d,int l,int r){
if(l>=r)return;
if(l==r-1){tree[d]=a[l];return;}
int mid=(l+r)/2;
int l_kid=d*2;
int r_kid=d*2+1;
built(l_kid,l,mid);
built(r_kid,mid,r);
tree[d]=tree[l_kid]+tree[r_kid];
}
void add(int d,int l,int r,int p,int q,int v){
if(p==l and q==r){lazy[d]+=v;tree[d]+=(r-l)*v;return;}
int mid=(l+r)/2;
int l_kid=d*2;
int r_kid=d*2+1;
if(p>=mid)add(r_kid,mid,r,p,q,v);
else if(q<=mid)add(l_kid,l,mid,p,q,v);
else{
add(l_kid,l,mid,p,mid,v);
add(r_kid,mid,r,mid,q,v);
}
tree[d]=tree[l_kid]+tree[r_kid];
}
int get(int d,int l,int r,int p,int q,int v){
if(p==l and q==r)return tree[d]+=(r-l)*v;
v+=lazy[d];
int mid=(l+r)/2;
int l_kid=d*2;
int r_kid=d*2+1;
lazy[d]=0;
if(p>=mid)return get(r_kid,mid,r,p,q,v);
if(q<=mid)return get(l_kid,l,mid,p,q,v);
return get(l_kid,l,mid,p,mid,v)+get(r_kid,mid,r,mid,q,v);
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++)
a[i]=read();
built(1,1,n+1);
while(m--){
z=read();
if(z==1){
x=read(),y=read(),k=read();
add(1,1,n+1,x,y+1,k);
}else{
x=read(),y=read();
printf("%d\n",get(1,1,n+1,x,y+1,0));
}
}
}