RT
#include<bits/stdc++.h>
using namespace std;
unsigned long long a,b,x,ans;
long long r()
{
long long num;
char x;
while(!isdigit(x=getchar()));
num=x^48;
while(isdigit(x=getchar()))
num=(num<<1)+(num<<3)+(x^48);
return num;
}
struct S
{
int l,r,w,f;
}tree[4*100001];
inline void down(int k)
{
tree[k<<1].f+=tree[k].f;
tree[k<<1|1].f+=tree[k].f;
tree[k<<1].w+=tree[k].f*(tree[k<<1].r-tree[k<<1].l+1);
tree[k<<1|1].w+=tree[k].f*(tree[k<<1|1].r-tree[k<<1|1].l+1);
tree[k].f=0;
}
inline void build(int ll,int rr,int k)
{
tree[k].l=ll,tree[k].r=rr;
if(ll==rr)
{
tree[k].w=r();
return ;
}
int mid=(ll+rr)>>1;
build(ll,mid,k<<1);
build(mid+1,rr,k<<1|1);
tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
}
inline void ask_i(int k)
{
if(tree[k].l==tree[k].r)
{
ans+=tree[k].w;
return;
}
if(tree[k].f)
down(k);
int mid=(tree[k].l+tree[k].r)>>1;
if(a<=mid)
ask_i(k<<1);
if(b>mid)
ask_i(k<<1|1);
}
inline void add_i(int k)
{
if(tree[k].l>=a&&tree[k].r<=b)
{
tree[k].w+=(tree[k].r-tree[k].l+1)*x;
tree[k].f+=x;
return ;
}
if(tree[k].f)
down(k);
int mid=(tree[k].l+tree[k].r)>>1;
if(a<=mid)
add_i(k<<1);
if(b>mid)
add_i(k<<1|1);
tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
}
int main()
{
long long n,m;
n=r(),m=r();
build(1,n,1);
for(int i=1;i<=m;i++)
{
long long xx;
xx=r();
if(xx==1)
{
a=r(),b=r(),x=r();
add_i(1);
}
else
{
a=r(),b=r();
ans=0;
ask_i(1);
printf("%lld\n",ans);
}
}
return 0;
}