#include<bits/stdc++.h>
using namespace std;
int n,m;
long long a[1111111],w[4111111],lzy[4111111];
void pushup(const int u){
w[u]=w[u*2]+w[u*2+1];
return;
}
void build(const int u,int l,int r){
if(l==r){
w[u]=a[l];
return;
}
int mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
pushup(u);
return;
}
void update1(int u,int l,int r,int p,long long x){
if(l==r){
w[u]=x;
}else {
int mid=(l+r)/2;
if(mid>=p){
update1(u*2,l,mid,p,x);
}else{
update1(u*2+1,mid+1,r,p,x);
}
pushup(u);
}
return;
}
long long query1(int u,int l,int r,int p){
if(l==r){
return w[u];
}else {
int mid=(l+r)/2;
if(mid>=p){
return query1(u*2,l,mid,p);
}else{
return query1(u*2+1,mid+1,r,p);
}
}
}
bool inrange(int l1,int r1,int l2,int r2){
return(l2<=l1)&&(r1<=r2);
}
bool outofrange(int l1,int r1,int l2,int r2){
return (l1>r2)||(r1<l2);
}
long long query2(int u,int l1,int r1,int l2,int r2){
if(inrange(l1,r1,l2,r2)){
return w[u];
}else if(!outofrange(l1,r1,l2,r2)){
int mid=(l1+r1)/2;
return query2(u*2,l1,mid,l2,r2)+query2(u*2+1,mid+1,r1,l2,r2);
}else return 0;
}
void maketag(int u,int len,long long x){
lzy[u]+=x;
w[u]+=len*x;
return;
}
void pushdown(int u,int l,int r){
int mid=(l+r)/2;
maketag(u*2,mid-l+1,lzy[u]);
maketag(u*2+1,r-mid,lzy[u]);
lzy[u]=0;
return;
}
void update2(int u,int l1,int r1,int l2,int r2,long long x){
if(inrange(l1,r1,l2,r2)){
maketag(u,r1-l1+1,x);
}else if(!outofrange(l1,r1,l2,r2)){
int mid=(l1+r1)/2;
pushdown(u,l1,r1);
update2(u*2,l1,mid,l2,r2,x);
update2(u*2+1,mid+1,r1,l2,r2,x);
pushup(u);
}
return;
}
int main(){
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
for(int t=1;t<=m;t++){
int op,x,y;
long long k=0;
cin>>op;
if(op==1){
cin>>x>>y>>k;
update2(1,1,n,x,y,k);
}else {
cin>>x>>y;
cout<<query2(1,1,n,x,y)<<endl;
}
}
return 0;
}