#include<bits/stdc++.h>
struct node{
int r,l,tag;
long long sum;
}tree[400000];
int x,y,k,f,a[100004];
int n,m;
int rs(int x){
return x<<1|1;
}
int ls(int x){
return x<<1;
}
int fa(int x){
return x>>1;
}
void pushup(int id){
tree[id].sum=tree[rs(id)].sum+tree[ls(id)].sum;
}
void pushdown(int id,int r,int l){
tree[rs(id)].tag=tree[id].tag;
tree[rs(id)].sum+=tree[id].tag*(tree[rs(id)].r-tree[rs(id)].l+1);
tree[ls(id)].tag=tree[id].tag;
tree[ls(id)].sum+=tree[id].tag*(tree[ls(id)].r-tree[ls(id)].l+1);
tree[id].tag=0;
}
void build(int id,int l,int r){
tree[id].tag=0;
tree[id].l=l;
tree[id].r=r;
if(l==r){
tree[id].sum=a[tree[id].l];
return ;
}
build(ls(id),l,(r+l)>>1);
build(rs(id),((r+l)>>1)+1,r);
pushup(id);
}
void update(int id,int l,int r,int x){
if(l<=tree[id].l&&r>=tree[id].r){
tree[id].tag=x;
tree[id].sum+=x*(tree[id].r-tree[id].l+1);
return ;
}
int m=(tree[id].l+tree[id].r)>>1;
if(l<=m)update(ls(id),l,(r+l)>>1,x);
if(r>m)update(rs(id),((r+l)>>1)+1,r,x);
pushup(id);
}
long long query(int id,int l,int r){
if(l<=tree[id].l&&r>=tree[id].r)return tree[id].sum;
int m=(tree[id].l+tree[id].r)>>1;
pushdown(id,l,r);
long long ans=0;
if(l<=m)ans+=(ls(id),l,(r+l)>>1);
if(r>m)ans+=(rs(id),((r+l)>>1)+1,r);
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
build(1,1,n);
while(m--){
scanf("%d%d%d",&f,&x,&y);
if(f==1){
scanf("%d",&k);
update(1,x,y,k);
}
else printf("%lld\n",query(1,x,y));
}
return 0;
}