#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct st{
ll l,r;
ll sum;
ll tag;
} tree[2000001];
ll arr[2000001];
void pushup(ll sp){
tree[sp].sum=tree[sp<<1].sum+tree[sp<<1|1].sum;
}
void pushdown(ll sp){
ll mid=(tree[sp].r+tree[sp].l)>>1;
tree[sp<<1].sum+=tree[sp].tag*(mid-tree[sp].l+1),tree[sp<<1|1].sum+=tree[sp].tag*(tree[sp].r-mid);
tree[sp<<1].tag+=tree[sp].tag,tree[sp<<1|1].tag+=tree[sp].tag;
tree[sp].tag=0;
}
void init(ll sp,ll l,ll r){
tree[sp].l=l,tree[sp].r=r;
if(l==r){
tree[sp].sum=arr[l];
return;
}
ll mid=(l+r)>>1;
init(sp<<1,l,mid);init(sp<<1|1,mid+1,r);
pushup(sp);
}
void add(ll sp,ll l,ll r,ll adn){
if(tree[sp].l>=l&&tree[sp].r<=r){
tree[sp].sum+=adn*(tree[sp].r-tree[sp].l+1);
tree[sp].tag+=adn;
return;
}
pushdown(sp);
ll mid=(tree[sp].l+tree[sp].r)>>1;
if(l<=mid)add(sp<<1,l,r,adn);
if(mid<r)add(sp<<1|1,l,r,adn);
pushup(sp);
}
ll query(ll sp,ll l,ll r){
if(tree[sp].l>=l&&tree[sp].r<=r)return tree[sp].sum;
pushdown(sp);
ll mid=(tree[sp].l+tree[sp].r)>>1,sum=0;
if(l<=mid)sum+=query(sp<<1,l,r);
if(mid<r)sum+=query(sp<<1|1,l,r);
return sum;
}
int main(){
ll n,T;
cin>>n>>T;
for(ll i=1;i<=n;i++){
cin>>arr[i];
}
init(1,1,n);
while(T--){
char mode;
cin>>mode;
if(mode=='1'){
ll x,y,k;
cin>>x>>y>>k;
add(1,x,y,k);
}
else{
ll x,y;
cin>>x>>y;
cout<<query(1,x,y)<<endl;
}
}
}