#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
#define ll long long
struct Node{
int l,r;
ll sum;
ll lz;
}tree[4*maxn+2];
void push_down(ll i){
if(tree[i].lz!=0){
tree[i<<1].lz+=tree[i].lz;
tree[i<<1|1].lz+=tree[i].lz;
tree[i<<1].sum+=tree[i<<1].lz*(tree[i<<1].r-tree[i<<1].l+1);
tree[i<<1|1].sum+=tree[i<<1|1].lz*(tree[i<<1|1].r-tree[i<<1|1].l+1);
tree[i].lz=0;
}
}
ll input[maxn];
void BuildTree(ll i,ll l,ll r){
ll mid=(l+r)>>1;
tree[i].l=l;
tree[i].r=r;
if(l==r){
tree[i].sum=input[l];
return;
}
BuildTree(i<<1,l,mid);
BuildTree(i<<1|1,mid+1,r);
tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
}
void add(ll i,ll x,ll y,ll k){
if(tree[i].l==tree[i].r){
tree[i].sum+=k*(tree[i].r-tree[i].l+1);
tree[i].lz+=k;
return;
}
push_down(i);
int mid=(tree[i].l+tree[i].r)>>1;
if(mid>=x){
add(i<<1,x,y,k);
}
if(mid<y){
add(i<<1|1,x,y,k);
}
tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
}
ll Search(ll i,ll x,ll y){
if(x<=tree[i].l&&y>=tree[i].r) {
return tree[i].sum;
}
if(tree[i].r<x||tree[i].l>y) return 0;
push_down(i);
int mid=(tree[i].l+tree[i].r)>>1;
ll s=0;
if(mid>=x){
s+=Search(i<<1,x,y);
}
if(mid<y){
s+=Search(i<<1|1,x,y);
}
return s;
}
int main(){
//freopen("P3372_8.in","r",stdin);
//freopen("Pww.out","w",stdout);
ll m,n;
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++) {
scanf("%lld",&input[i]);
}
BuildTree(1,1,n);
for(int c=0;c<m;c++){
ll op,x,y,k;
scanf("%lld",&op);
if(op==1){
scanf("%lld%lld%lld",&x,&y,&k);
add(1,x,y,k);
}
if(op==2){
scanf("%lld%lld",&x,&y);
printf("%lld\n",Search(1,x,y));
}
}
}