#include<bits/stdc++.h>
using namespace std;
int input[100010];
struct DATA{
long long l,r,lazy,sum;
}tree[500010];
void Build(int s,int l,int r){
tree[s].l=l;
tree[s].r=r;
if(l==r){
tree[s].sum=input[l];
return;
}
int mid=(l+r)/2;
Build(s*2,l,mid);
Build(s*2+1,mid+1,r);
tree[s].sum=tree[s*2].sum+tree[s*2+1].sum;
}
void Godown(int s){
tree[s*2].lazy+=tree[s].lazy;
tree[s*2].sum+=(tree[s*2].r-tree[s*2].l+1)*tree[s].lazy;
tree[s*2+1].lazy+=tree[s].lazy;
tree[s*2+1].sum+=(tree[s*2+1].r-tree[s*2+1].l+1)*tree[s].lazy;
tree[s].lazy=0;
}
void Update(int s,int l,int r,int v){
if(tree[s].l>r || tree[s].r<l)
return;
if(tree[s].l>=l && tree[s].r<=r){
tree[s].lazy+=v;
tree[s].sum+=(tree[s].r-tree[s].l+1)*v;
return;
}
if(tree[s].lazy>0)
Godown(s);
Update(s*2,l,r,v);
Update(s*2+1,l,r,v);
tree[s].sum=tree[s*2].sum+tree[s*2+1].sum;
}
long long Search(int s,int l,int r)
{
if(tree[s].l>r || tree[s].r<l)
return 0;
if(tree[s].l>=l && tree[s].r<=r)
return tree[s].sum;
if(tree[s].lazy>0)
Godown(s);
return Search(s*2,l,r)+Search(s*2+1,l,r);
}
int main(){
int m,n;
cin>>m>>n;
for(int i=1;i<=m;i++)
cin>>input[i];
Build(1,1,m);
for(int i=1;i<=n;i++){
int q,w,e;
cin>>q;
if(q==1){
int v_;
cin>>w>>e>>v_;
Update(1,w,e,v_);
}
else{
cin>>w>>e;
cout<<Search(1,w,e);
}
}
}