#include<iostream>
const int N=1e5+10;
int n,m,a[N],t,d[N],x,y,k,b[N];
using namespace std;
int sum;
void build(int start,int end,int number)
{
if(start==end)
{
d[number]=a[start];
return;
}
int mid=start+((end-start)>>1);
build(start,mid,number*2);
build(mid+1,end,number*2|1);
d[number]=d[number*2]+d[number*2|1];
}
int getsum(int left,int right,int start,int end,int p)
{
if(left<=start&&right>=end)
{
return d[p];
}
int mid=start+((end-start)>>1),sum=0;
if(b[p])
{
d[p<<1]+=(mid-start)*b[p];
d[(p<<1)|1]+=(mid-start+1)*b[p];
b[p<<1]+=b[p];
b[(p<<1)|1]+=b[p];
}
b[p]=0;
sum=0;
if(left<=mid)
{
sum+=getsum(left,right,start,mid,p*2);
}
if(right>mid)
{
sum+=getsum(left,right,mid+1,end,(p<<1)|1);
}
return sum;
}
void update(int left,int right,int value,int start,int end,int p)
{
if(left<=start&&end<=right)
{
d[p]+=(end-start+1)*value;
b[p]+=value;
return;
}
int mid=start+((end-start)>>1);
if(b[p])
{
d[p<<1]+=(mid-start+1)*b[p];
d[(p<<1)|1]+=(end-mid)*b[p];
b[p<<1]+=b[p];
b[(p<<1)|1]+=b[p];
}
b[p]=0;
if(left<=mid)
{
update(left,right,value,start,mid,p<<1);
}
if(right>mid)
{
update(left,right,value,mid+1,end,(p<<1)|1);
}
d[p]=d[(p<<1)|1]+d[(p<<1)|1];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,n,1);
while(m--)
{
cin>>t;
if(t==1)
{
cin>>x>>y>>k;
update(x,y,k,1,n,1);
}
if(t==2)
{
cin>>x>>y;
cout<<getsum(x,y,1,n,1)<<endl;
}
}
return 0;
}