#include <bits/stdc++.h>
using namespace std;
int n,q,a[100001];
struct stree{
int l,r;
long long sum,pl;
}t[600000];
void add(int l,int r,long long pl,int pos)
{
int mid=(t[pos].l+t[pos].r)>>1;
if (l<=t[pos].l && r>=t[pos].r){
t[pos].pl+=pl;
return;
}
t[pos].sum+=(min(r,t[pos].r)-max(l,t[pos].l)+1)*pl;
if (l<=mid){
add(l,r,pl,pos<<1);
}
if (r>mid){
add(l,r,pl,pos<<1|1);
}
}
long long sum(int l,int r,int pos)
{
if (t[pos].pl){
t[pos].sum+=t[pos].pl*(t[pos].r-t[pos].l+1);
if (t[pos].l!=t[pos].r){
t[pos<<1].pl+=t[pos].pl;
t[pos<<1|1].pl+=t[pos].pl;
}
t[pos].pl=0;
}
long long ans=0;
int mid=(t[pos].l+t[pos].r)>>1;
if (l<=t[pos].l && r>=t[pos].r){
return t[pos].sum;
}
if (l<=mid){
ans+=sum(l,r,pos<<1);
}
if (r>mid){
ans+=sum(l,r,pos<<1|1);
}
return ans;
}
long long built(int l,int r,int pos)
{
int mid=(l+r)>>1;
t[pos].l=l;
t[pos].r=r;
if (l==r){
t[pos].sum=a[l];
return a[l];
}
t[pos].sum=built(l,mid,pos<<1)+built(mid+1,r,pos<<1|1);
return t[pos].sum;
}
int main()
{
cin>>n>>q;
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
built(1,n,1);
for (int i=1;i<=q;i++){
int k,l,r;
scanf("%d%d%d",&k,&l,&r);
if (k==2){
printf("%lld\n",sum(l,r,1));
}
else {
long long x;
scanf("%lld",&x);
add(l,r,x,1);
}
}
}