#include<bits/stdc++.h>
using namespace std;
int n,m,a[100005];
struct node{
long long sum,l,r,lazy;
}tree[400005];
void build(int id,int l,int r)
{
tree[id].l=l;
tree[id].r=r;
if(l==r)
{
tree[id].sum=a[l];
return ;
}
build(id*2,l,(l+r)/2);
build(id*2+1,(l+r)/2+1,r);
tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
}
void pushdown(int id)
{
int k=tree[id].lazy;
tree[id*2].sum+=(tree[id*2].r-tree[id*2].l+1)*k;
tree[id*2+1].sum+=(tree[id*2+1].r-tree[id*2+1].l+1)*k;
tree[id*2].lazy=k,tree[id*2+1].lazy=k;
tree[id].lazy=0;
}
long long search(long long id,long long l,long long r)
{
if(l<=tree[id].l&&r>=tree[id].r)
return tree[id].sum;
if(tree[id].r<l||tree[id].l>r)
return 0;
long long cnt=0;
pushdown(id);
if(tree[id*2].r>=l)
cnt+=search(id*2,l,r);
if(tree[id*2+1].l<=r)
cnt+=search(id*2+1,l,r);
return cnt;
}
void add(long long id,long long l,long long r,long long k)
{
if(l<=tree[id].l&&r>=tree[id].r)
{
tree[id].sum+=(tree[id].r-tree[id].l+1)*k;
tree[id].lazy+=k;
return ;
}
pushdown(id);
if(tree[id*2].r>=l)
add(id*2,l,r,k);
if(tree[id*2+1].l<=r)
add(id*2+1,l,r,k);
tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
}
int main()
{
cin>>n>>m;
for(long long i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
while(m--)
{
long long pd,x,y;
cin>>pd>>x>>y;
if(pd-1){
cout<<search(1,x,y)<<endl;
}
else
{
long long k;
cin>>k;
add(1,x,y,k);
}
}
return 0;
}