#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct Node {
int l,r;
int sum;
}tree[1000010];
int a[1000010];
int tag[1000010];
void push_down(int index) {
if(tag[index]!=0) {
tag[index<<1] += tag[index];
tag[index<<1+1] += tag[index];
tree[index<<1].sum += tag[index]*(tree[index<<1].r-tree[index<<1].l+1);
tree[index<<1+1].sum += tag[index]*(tree[index<<1+1].r-tree[index<<1+1].l+1) ;
tag[index] = 0;
}
}
void build(int index, int left, int right) {
tree[index].l = left;
tree[index].r = right;
if(left == right) {tree[index].sum = a[left];return;}
build(index<<1, left, (left+right)/2);
build(index<<1+1, (left+right)/2+1, right);
tree[index].sum = tree[index<<1].sum + tree[index<<1+1].sum;
}
ll quire(int index, int left, int right) {
if(tree[index].l>=left && tree[index].r<=right) {
return tree[index].sum;
}
push_down(index);
ll ans = 0;
if(left<=tree[index<<1].r)
ans += quire(index<<1, left, right);
if(right>=tree[index<<1+1].l)
ans += quire(index<<1+1,left,right);
return ans;
}
void update (int index, int left, int right, int k) {
if(tree[index].l>=left && tree[index].r<=right){
tree[index].sum += k*(tree[index].r-tree[index].l+1);
tag[index] += k;
return;
}
push_down(index);
if(left<=tree[index<<1].r)update(index<<1, left,right,k);
if(right>=tree[index<<1+1].l)update(index<<1+1,left,right,k);
tree[index].sum = tree[index<<1].sum + tree[index<<1+1].sum;
}
void solve() {
int n,q;cin>>n>>q;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(q--){
int pd;cin>>pd;
if(pd==1){
int l,r,k;cin>>l>>r>>k;
update(1,l,r,k);
}else {
int l,r;cin>>l>>r;
cout<<quire(1,l,r)<<endl;
}
}
}
int main() {
ll T = 1;
while(T--)solve();
return 0;
}