#include <bits/stdc++.h>
using namespace std;
int n,m,a[100005],mak;
struct node{
int l,r,s,la;
}t[400005];
void lazy(int k,int v)
{
t[k].s+=(t[k].r-t[k].l+1)*v;;
t[k].la=v;
}
void pushdown(int k)
{
lazy(k*2,t[k].la);
lazy(k*2+1,t[k].la);
t[k].la=-1;
}
void build(int k,int le,int ri)
{
t[k].l=le;
t[k].r=ri;
t[k].la=-1;
mak=max(k,mak);
if(le==ri)
{
t[k].s=a[le];
return;
}
int mid=(le+ri)/2;
build(k*2,le,mid);
build(k*2+1,mid+1,ri);
t[k].s=t[k*2].s+t[k*2+1].s;
}
void add(int k,int le,int ri,int v)
{
if(t[k].l>=le && t[k].r<=ri)
return lazy(k,v);
if(t[k].la!=-1)
pushdown(k);
int mid=(t[k].l+t[k].r)/2;
if(le<=mid)
add(k*2,le,ri,v);
if(ri>mid)
add(k*2+1,le,ri,v);
t[k].s=t[k*2].s+t[k*2+1].s;
}
int qu(int k,int le,int ri)
{
int sum=0;
if(t[k].l>=le && t[k].r<=ri)
return t[k].s;
if(t[k].la!=-1)
pushdown(k);
int mid=(t[k].l+t[k].r)/2;
if(le<=mid)
sum+=qu(k*2,le,ri);
if(ri>mid)
sum+=qu(k*2+1,le,ri);
return sum;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
for(int i=1;i<=m;i++)
{
int x;
cin>>x;
if(x==1)
{
int w,y,z;
cin>>w>>y>>z;
add(1,w,y,z);
}
else
{
int y,z;
cin>>y>>z;
cout<<qu(1,y,z)<<endl;
}
}
return 0;
}