#include<cstdio>
#include<cstring>
template<typename Type>inline Type Max(Type x,Type y){if(x>y)return x;return y;}
template<typename Type>inline Type Min(Type x,Type y){if(x<y)return x;return y;}
template<typename Type>inline Type Swap(Type &x,Type &y){Type swap=x;x=y;y=swap;}
template<typename Type=long long,int MaxCnt=3010000>struct Segment_Tree
{
Segment_Tree(){Clean();}
Type DataA[MaxCnt],DataSqrA[MaxCnt],Covertag[MaxCnt];int Son[MaxCnt][2],Left[MaxCnt],Right[MaxCnt],cnt,root;
inline void Clean(){memset(this,0,sizeof(this));}
inline void PushUp(int now)
{
DataA[now]=DataA[Son[now][0]]+DataA[Son[now][1]];
DataSqrA[now]=DataSqrA[Son[now][0]]+DataSqrA[Son[now][1]];
}
inline void PushDown(int now)
{
if(Son[now][0])
{
Covertag[Son[now][0]]+=Covertag[now];
DataSqrA[Son[now][0]]+=Covertag[now]*Covertag[now]*(Right[Son[now][0]]-Left[Son[now][0]]+1)+2*Covertag[now]*DataA[Son[now][0]];
DataA[Son[now][0]]+=Covertag[now]*(Right[Son[now][0]]-Left[Son[now][0]]+1);
}
if(Son[now][1])
{
Covertag[Son[now][1]]+=Covertag[now];
DataSqrA[Son[now][1]]+=Covertag[now]*Covertag[now]*(Right[Son[now][1]]-Left[Son[now][1]]+1)+2*Covertag[now]*DataA[Son[now][1]];
DataA[Son[now][1]]+=Covertag[now]*(Right[Son[now][1]]-Left[Son[now][1]]+1);
}
}
inline void Build(int &now,int left,int right,int *Arr)
{
now=++cnt;
Left[now]=left;Right[now]=right;
if(left==right){DataA[now]=Arr[left];DataSqrA[now]=Arr[left]*Arr[right];return;}
else
{
int mid=(left+right)>>1;
Build(Son[now][0],left,mid,Arr);
Build(Son[now][1],mid+1,right,Arr);
PushUp(now);
}
}
inline void Modify(int now,int left,int right,int value)
{
PushDown(now);
if(left<=Left[now]&&Right[now]<=right)
{
Covertag[now]=value;
DataSqrA[now]+=Covertag[now]*Covertag[now]*(Right[now]-Left[now])+2*Covertag[now]*DataA[now];
DataA[now]+=Covertag[now]*(Right[now]-Left[now]);
return;
}
else
{
int mid=(Left[now]+Right[now])>>1;
if(right<=mid)Modify(Son[now][0],left,right,value);
else if(mid+1<=left)Modify(Son[now][1],left,right,value);
else
{
Modify(Son[now][0],left,right,value);
Modify(Son[now][1],left,right,value);
}
PushUp(now);
}
}
inline Type Query(int now,int left,int right)
{
PushDown(now);
if(left<=Left[now]&&Right[now]<=right){return DataSqrA[now];}
else
{
int mid=(Left[now]+Right[now])>>1;
if(right<=mid)return Query(Son[now][0],left,right);
else if(mid+1<=left)return Query(Son[now][1],left,right);
else return Query(Son[now][0],left,right)+Query(Son[now][1],left,right);
}
}
};Segment_Tree<>T;
int n,m,Arr[1100000];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&Arr[i]);
T.Build(T.root,1,n,Arr);
for(int i=1;i<=m;i++)
{
int opt,l,r;
scanf("%d%d%d",&opt,&l,&r);
if(opt==0)
{
long long k;scanf("%lld",&k);
T.Modify(T.root,l,r,k);
}
else
{
printf("%lld\n",T.Query(T.root,l,r));
}
}
return 0;
}