#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ls u << 1
#define rs u << 1 | 1
const int N = 1e5 + 10;
struct node
{
int l,r,sum,tag;
} tr[N * 4];
int a[N];
void pushup(int u)
{
tr[u].sum = tr[ls].sum + tr[rs].sum;
}
void pushdown(int u)
{
if(!tr[u].tag)
{
return;
}
tr[ls].sum += (tr[ls].r - tr[ls].l + 1) * tr[u].tag;
tr[ls].tag += tr[u].tag;
tr[rs].sum += (tr[rs].r - tr[rs].l + 1) * tr[u].tag;
tr[rs].tag += tr[u].tag;
tr[u].tag = 0;
}
void build(int u,int l,int r)
{
if(l == r)
{
tr[u] = {l,r,a[l],0};
return;
}
tr[u].l = l;
tr[u].r = r;
int mid = (l + r) >> 1;
build(ls,l,mid);
build(rs,mid + 1,r);
pushup(u);
}
void update(int u,int l,int r,int x)
{
if(l <= tr[u].l && tr[u].r <= r)
{
tr[u].sum += (tr[u].r - tr[u].l + 1) * x;
tr[u].tag = x;
return;
}
pushdown(u);
int mid = (tr[u].l + tr[u].r) >> 1;
if(l <= mid)
{
update(ls,l,r,x);
}
if(mid < r)
{
update(rs,l,r,x);
}
pushup(u);
}
int query(int u,int l,int r)
{
if(l <= tr[u].l && tr[u].r <= r)
{
return tr[u].sum;
}
pushdown(u);
int mid = (tr[u].l + tr[u].r) >> 1,ans = 0;
if(l <= mid)
{
ans += query(ls,l,r);
}
if(mid < r)
{
ans += query(rs,l,r);
}
return ans;
}
signed main()
{
int n,m;
cin >> n >> m;
for(int i = 1;i <= n;i++)
{
cin >> a[i];
}
build(1,1,n);
while(m--)
{
int op;
cin >> op;
if(op == 1)
{
int l,r,x;
cin >> l >> r >> x;
update(1,l,r,x);
}
else
{
int l,r;
cin >> l >> r;
cout << query(1,l,r) << endl;
}
}
return 0;
}