#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+10;
ll a[N];
struct Node{
ll it;
ll l;
ll r;
ll data;
}tree[N<<2];
ll n,m;
void build(ll rt,ll l,ll r){
tree[rt].l = l;
tree[rt].r = r;
tree[rt].it = 0;
if(l == r) {
tree[rt].data = a[l];
return ;
}
ll mid = (l + r)>>1;
build(rt*2,l,mid);
build(rt*2+1,mid+1,r);
tree[rt].data = tree[rt*2].data+tree[rt*2+1].data;
return ;
}
void push_down(ll rt){
if(tree[rt].it!=0){
tree[rt*2].it+=tree[rt].it;
tree[rt*2+1].it+=tree[rt].it;
ll mid = (tree[rt].l+tree[rt].r)>>1;
tree[rt*2].data+=tree[rt].it*(mid-tree[rt*2].l+1);
tree[rt*2+1].data+=tree[rt].it*(tree[rt*2+1].r-mid);
tree[rt].it=0;
}
return ;
}
void up_data(ll rt,ll l,ll r,ll k){
if(tree[rt].l>=l&&tree[rt].r<=r){
tree[rt].data+=k*(tree[rt].r-tree[rt].l+1);
tree[rt].it+=k;
return ;
}
push_down(rt);
if(tree[rt*2].r>=l){
up_data(rt*2,l,r,k);
}
if(tree[rt*2+1].l<=r){
up_data(rt*2+1,l,r,k);
}
tree[rt].data = tree[rt*2].data + tree[rt*2+1].data;
return ;
}
ll search(ll rt,ll l,ll r){
if(tree[rt].l>=l&&tree[rt].r<=r){
return tree[rt].data;
}
push_down(rt);
ll num=0;
if(tree[rt*2].r>=l){
num+=search(rt*2,l,r);
}
if(tree[rt*2+1].l<=r){
num+=search(rt*2+1,l,r);
}
return num;
}
int main(){
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,1,n);
for(ll i = 1;i <= m;i++){
ll go;
scanf("%lld",&go);
if(go == 1){
ll x,y,k;
scanf("%lld%lld%lld",&x,&y,&k);
up_data(1,x,y,k);
}
if(go == 2){
ll x,y;
scanf("%lld%lld",&x,&y);
printf("%lld
",search(1,x,y));
}
}
return 0;
}