#include <iostream>
using namespace std;
const int N=100005,M=400005;
long long a[N],k;
struct Tree{
long long val,tag;
int left,right;
}tree[M];
int l,r;
void init(int u,int left,int right)
{
if (left==right)
{
tree[u].val = a[left];
tree[u].left = tree[u].right = left;
return;
}
int mid=(left+right)>>1;
init(u*2,left,mid);
init(u*2+1,mid+1,right);
tree[u].val = tree[u*2].val + tree[u*2+1].val;
tree[u].left = tree[u*2].left;
tree[u].right = tree[u*2+1].right;
}
long long find(int u)
{
if (l <= tree[u].left && r >= tree[u].right)
return tree[u].val;
if (l <= tree[u].left || r >= tree[u].right)
return find(u*2) + find(u*2+1);
return 0;
}
void maketag(int u,int len,long long x)
{
tree[u].val += len*x;
tree[u].tag += x;
}
void pushdown(int u)
{
int mid = (tree[u].left + tree[u].right) / 2;
maketag(u*2, mid - tree[u].left + 1, tree[u].tag);
maketag(u*2+1, tree[u].right - mid, tree[u].tag);
tree[u].tag = 0;
}
void update(int u)
{
if (l <= tree[u].left && r >= tree[u].right)
maketag(u,tree[u].right - tree[u].left + 1,k);
else if (l <= tree[u].left || r >= tree[u].right)
{
if (tree[u].tag)
pushdown(u);
update(u*2);
update(u*2+1);
tree[u].val = tree[u*2].val + tree[u*2+1].val;
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n,m;
cin >> n >> m;
for (int i=1;i<=n;i++)
cin >> a[i];
init(1,1,n);
while (m--)
{
int op;
cin >> op >> l >> r;
if (op==1)
{
cin >> k;
update(1);
}
else
cout << find(1) << '\n';
}
return 0;
}