rt
#include <bits/stdc++.h>
#define ll long long
#define l(x) (x<<1)
#define r(x) (x<<1|1)
#define bar(x,y) (x+y>>1)
using namespace std;
const int N=1e5+5;
const int inf=1e9;
ll n,m,arr[N];
struct stu {
ll le,ri,val,add;
}tree[N];
void ee(ll p) {
if(tree[p].add) {
tree[l(p)].val+=tree[p].add*(tree[l(p)].ri-tree[l(p)].le+1);
tree[r(p)].val+=tree[p].add*(tree[r(p)].ri-tree[r(p)].le+1);
tree[l(p)].add+=tree[p].add;
tree[r(p)].add+=tree[p].add;
tree[p].add=0;
}
}
void upd(ll p) {
tree[p].val=tree[l(p)].val+tree[r(p)].val;
}
void bui(ll p,ll le,ll ri) {
tree[p].le=le;
tree[p].ri=ri;
tree[p].add=0;
if(le==ri) {
tree[p].val=arr[le];
return ;
}
ll mid=bar(le,ri);
bui(l(p),le,mid);
bui(r(p),mid+1,ri);
upd(p);
}
void add(ll p,ll le,ll ri,ll x) {
if(le<=tree[p].le&&tree[p].ri<=ri) {
tree[p].val+=x*(tree[p].ri-tree[p].le+1);
tree[p].add+=x;
return ;
}
ee(p);
ll mid=bar(tree[p].le,tree[p].ri);
if(le<=mid) return add(l(p),le,ri,x);
if(mid<=ri) return add(r(p),le,ri,x);
upd(p);
}
ll ask(ll p,ll le,ll ri) {
if(le<=tree[p].le&&tree[p].ri<=ri) return tree[p].val;
ee(p);
ll mid=bar(tree[p].le,tree[p].ri),sum=0;
if(le<=mid) sum+=ask(l(p),le,ri);
if(ri>mid) sum+=ask(r(p),le,ri);
return sum;
}
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++) {
cin>>arr[i];
}
bui(1,1,n);
while(m--) {
ll t;
cin>>t;
if(t==1) {
ll x,y,k;
cin>>x>>y>>k;
add(1,x,y,k);
}
else {
ll x,y;
cin>>x>>y;
cout<<ask(1,x,y)<<endl;
}
}
return 0;
}