#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
struct SegmentTree{
int l,r;
long long sum,add;
#define l(x) tree[x].l
#define r(x) tree[x].r
#define sum(x) tree[x].sum
#define add(x) tree[x].add
}tree[maxn * 4];
int a[maxn],n,m;
void build(int p,int l,int r){
l(p) = l;
r(p) = r;
if(l == r){
sum(p) = a[l];
return;
}
int mid = (l + r) / 2;
build(p * 2,l,mid);
build(p * 2 + 1,mid + 1,r);
sum(p) = sum(p * 2) + sum(p * 2 + 1);
}
void push_down(int p){
if(add(p)){
sum(p * 2) += add(p) * (r(p * 2) - l(p * 2) + 1);
sum(p * 2 + 1) += add(p) * (r(p * 2 + 1) - l(p * 2 + 1) + 1);
add(p * 2) += add(p);
add(p * 2 + 1) += add(p);
add(p) = 0;
}
}
void change(int p,int l,int r,int d){
if(l <= l(p) && r >= r(p)){
sum(p) += (long long)d * (r(p) - l(p) + 1);
add(p) += d;
return;
}
push_down(p);
int mid = (l(p) + r(p)) / 2;
if(l <= mid) change(p * 2,l,r,d);
if(r > mid) change(p * 2 + 1,l,r,d);
sum(p) = sum(p * 2) + sum(p * 2 + 1);
}
long long query1(int p,int l,int r){
if(l <= l(p) && r >= r(p)) return sum(p);
push_down(p);
int mid = (l(p) + r(p)) / 2;
long long val = 0;
if(l <= mid) val += query1(p * 2,l,r);
if(r > mid) val += query1(p * 2 + 1,l,r);
return val;
}
long long query2(int p,int l,int r){
if(l <= l(p) && r >= r(p)) return sum(p);
push_down(p);
int mid = (l(p) + r(p)) / 2;
long long val = 0;
if(l <= mid) val += query2(p * 2,l,r) * query2(p * 2,l,r);
if(r > mid) val += query2(p * 2 + 1,l,r) * query2(p * 2 + 1,l,r);
return val;
}
int main(){
cin >> n >> m;
for(int i = 1;i <= n;i++){
scanf("%d",&a[i]);
}
build(1,1,n);
int opt;
for(int i = 1;i < m;i++){
cin >> opt;
if(opt == 1){
int x,y,k;
cin >> x >> y >> k;
change(1,x,y,k);
}
if(opt == 2){
int x,y;
cin >> x >> y;
cout << query1(1,x,y) << endl;
}
}
return 0;
}