#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N],f[N*4],tag[N*4];
void build(int,int,int);
void add(int,int,int,int,int,int);
void push_down(int,int,int);
int ask(int,int,int,int,int);
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
int opt,x,y;
cin>>opt>>x>>y;
if(opt==1)
{
int c;
cin>>c;
add(1,1,n,x,y,c);
}
else
{
cout<<ask(1,1,n,x,y)<<endl;
}
}
return 0;
}
void build(int i,int left,int right)
{
if(left==right)
{
f[i]=a[left];
return;
}
int middle=(left+right)>>1;
build(i+i,left,middle);
build(i+i+1,middle+1,right);
f[i]=f[i+i]+f[i+i+1];
}
void add(int i,int left,int right,int u,int v,int c)
{
if(left==u and right==v)
{
f[i]+=(right-left)*c;
tag[i]+=c;
return;
}
int middle=(left+right)>>1;
push_down(i,left,right);
if(u<=middle)
{
add(i+i,left,middle,u,v,c);
}
if(v>=middle+1)
{
add(i+i+1,middle+1,right,u,v,c);
}
f[i]=f[i+i]+f[i+i+1];
}
void push_down(int i,int left,int right)
{
int middle=(left+right)>>1;
tag[i+i]+=tag[i];
f[i+i]+=tag[i]*(middle-left+1);
tag[i+i+1]+=tag[i];
f[i+i+1]+=tag[i]*(right-middle);
tag[i]=0;
}
int ask(int i,int left,int right,int u,int v)
{
if(left==u and right==v)
{
return f[i];
}
int middle=(left+right)>>1;
push_down(i,left,right);
if(v<=middle)
{
return ask(i+i,left,middle,u,v);
}
if(u>=middle+1)
{
return ask(i+i+1,middle+1,right,u,v);
}
return ask(i+i,left,middle,u,middle)+ask(i+i+1,middle+1,right,middle+1,v);
}