RT
#include<iostream>
#include<cstdio>
#define l(x) tree[x].l
#define r(x) tree[x].r
#define sum(x) tree[x].sum
#define add(x) tree[x].add
using namespace std;
const int SIZE=1e5+1;
struct Sugmenttree
{
int l,r;
long long sum,add;
}tree[SIZE*4];
int a[SIZE];
int n,m;
inline void build(int p,int l,int r)
{
cout<<p<<" "<<l<<" "<<r<<endl;
l(p)=l,r(p)=r;
if(l==r)
{
sum(p)=a[l];
return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build((p<<1)+1,mid+1,r);
sum(p)=sum(p*2)+sum(p*2+1);
}
inline void push_down(int p)
{
if(add(p))
{
sum(p<<1)+=add(p)*(r(p<<1)-l(p<<1)+1);
sum((p<<1)+1)+=add(p)*(r((p<<1)+1)-l((p<<1)+1)+1);
add(p<<1)+=add(p);
add((p<<1)+1)+=add(p);
add(p)=0;
}
}
inline void change(int p,int l,int r,int d)
{
// printf("change ok");
if(l<=l(p)&&r>=r(p))
{
sum(p)+=((long long)d*(r(p)-l(p))+1);
add(p)+=d;
return;
}
push_down(p);
int mid=(l(p)+r(p))/2;
if(l<=mid)change(p*2,l,r,d);
if(r>mid) change(p*2+1,l,r,d);
sum(p)=sum(p*2)+sum(p*2+1);
}
inline long long ask(int p,int l,int r)
{
if(l<=l(p)&&r>=r(p))
{
return sum(p);
}
push_down(p);
int mid=(l(p)+r(p))/2;
long long ans=0;
if(l<=mid)ans+=ask(p*2,l,r);
if(r>mid) ans+=ask(p*2+1,l,r);
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
while(m--)
{
int op,x,y;
cin>>op>>x>>y;
if(op==1)
{
int d;
cin>>d;
change(1,x,y,d);
}
else
{
cout<<ask(1,x,y)<<endl;
}
}
return 0;
}