#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const int N = 100010;
int n, m;
int w[N];
struct node
{
int l, r;
int sum, sum2;
int add;
}tr[N*4];
void pushup(int u)
{
tr[u].sum = tr[u<<1].sum + tr[u<<1|1].sum;
tr[u].sum2 = tr[u<<1].sum2 + tr[u<<1|1].sum2;
}
void cal(node &t,int add)
{
t.sum2 = t.sum2 + 2ll * t.sum * add + (t.r - t.l + 1) * add * add;
t.sum = t.sum + (t.r - t.l + 1) * add;
}
void pushdown(int u)
{
if(tr[u].add)
{
cal(tr[u<<1], tr[u].add);
cal(tr[u<<1|1], tr[u].add);
tr[u<<1].add += tr[u].add;
tr[u<<1|1].add += tr[u].add;
tr[u].add = 0;
}
}
void build(int u,int l,int r)
{
if(l == r)tr[u] = {l, r, w[l], w[l]*w[l], 0};
else
{
tr[u] = {l,r};
int mid = l + r >> 1;
build(u<<1, l, mid);
build(u<<1|1, mid+1, r);
pushup(u);
}
}
void modify(int u,int l,int r,int v)
{
if(tr[u].l >= l && tr[u].r <= r)
{
cal(tr[u], v);
tr[u].add += v;
return ;
}
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
if(l <= mid) modify(u<<1, l, r, v);
if(r > mid) modify(u<<1|1, l, r, v);
pushup(u);
}
pair<int,int> query(int u,int l,int r)
{
if(tr[u].l >= l && tr[u].r <= r)return {tr[u].sum, tr[u].sum2};
int sum1 = 0, sum2 = 0;
int mid=tr[u].l + tr[u].r >> 1;
pushdown(u);
if(l <= mid)
{
pair<int,int> t = query(u<<1, l, r);
sum1 += t.first;
sum2 += t.second;
}
if(r>mid)
{
pair<int,int> t = query(u<<1|1, l, r);
sum1 += t.first;
sum2 += t.second;
}
return {sum1,sum2};
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>w[i];
build(1, 1, n);
int op,l,r;
while(m--)
{
cin>>op>>l>>r;
if(op==1)
{
int k;cin>>k;
modify(1, l, r, k);
}
else
{
pair<int,int> t = query(1, l, r);
cout<<(t.first * t.first - t.second) / 2 <<'\n';
}
}
}