#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100001;
ll input[N+5];
struct node{ll l,r,sum,lz;}tree[(N<<2)+5];
inline void build(ll i,ll l,ll r){
tree[i].l=l;tree[i].r=r;
if(l==r){
tree[i].sum=input[l];
return;
}
ll mid=(l+r)>>1;
build(i<<1,l,mid);
build(i<<1|1,mid+1,r);
tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
}
inline void push_down(ll x){
if(tree[x].lz){
tree[x<<1].l+=tree[x].lz;
tree[x<<1|1].l+=tree[x].lz;
ll mid=(tree[x].l+tree[x].r)>>1;
tree[x<<1].sum+=tree[x].lz*(mid-tree[x<<1].l+1);
tree[x<<1|1].sum+=tree[x].lz*(tree[x<<1|1].r-mid);
tree[x].lz=0;
}
return;
}
inline void add3(ll i,ll l,ll r,ll val){
if(tree[i].l>=l&&tree[i].r<=r){
tree[i].sum+=val*(tree[i].r-tree[i].l+1);
tree[i].lz+=val;
return;
}
push_down(i);
if(tree[i<<1].r>=l) add3(i<<1,l,r,val);
if(tree[i<<1|1].l<=r) add3(i<<1|1,l,r,val);
tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
return;
}
inline int find3(ll i,ll l,ll r){
if(tree[i].l>=l&&tree[i].r<=r)
return tree[i].sum;
ll cnt=0;
if(tree[i].r<l||tree[i].l>r) return cnt;
push_down(i);
if(tree[i<<1].r>=l) cnt+=find3(i<<1,l,r);
if(tree[i<<1|1].l<=r) cnt+=find3(i<<1|1,l,r);
}
int n,m;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d",&input[i]);
build(1,1,n);
for(int i=1;i<=m;++i) {
int x;
cin>>x;
if(x==1){
ll p,q,val;
cin>>p>>q>>val;
add3(1,p,q,val);
}
else{
ll p,q;
cin>>p>>q;
cout<<find3(1,p,q);
}
}
return 0;
}