#include<iostream>
#include<cmath>
#include<map>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
struct node{
int sum;
int l,r;
int lan;
}tree[10000000];
void down(int n){
tree[n*2].lan+=tree[n].lan;
tree[n*2+1].lan+=tree[n].lan;
tree[n*2].sum=tree[n].lan*(tree[n*2].r-tree[n*2].l+1);
tree[n*2+1].sum=tree[n].lan*(tree[n*2+1].r-tree[n*2+1].l+1);
tree[n].lan=0;
}
void build(int l,int r,int n){
tree[n].l=l,tree[n].r=r;
if(l==r){
cin >>tree[n].sum;
return;
}
int mid=(l+r)/2;
build(l,mid,n*2);
build(mid+1,r,n*2+1);
tree[n].sum=tree[n*2+1].sum+tree[n*2].sum;
return;
}
void add(int l,int r,int n,int L,int R,int v){
if(L<=l&&r<=R){
tree[n].sum+=v*(r-l+1);
tree[n].lan+=v;
return;
}
down(n);
int mid=(l+r)/2;
if(L<=mid)add(l,mid,n*2,L,R,v);
if(R>mid)add(mid+1,r,n*2+1,L,R,v);
tree[n].sum=tree[n*2+1].sum+tree[n*2].sum;
return;
}
int ans;
void find(int l,int r,int n,int L,int R){
if(L<=l&&r<=R){
ans+=tree[n].sum;
return;
}
down(n);
int mid=(l+r)/2;
if(L<=mid)find(l,mid,n*2,L,R);
if(R>mid)find(mid+1,r,n*2+1,L,R);
tree[n].sum=tree[n*2+1].sum+tree[n*2].sum;
return;
}
int n,m;
int main(){
cin >>n>>m;
build(1,n,1);
for(int i=1;i<=m;i++){
int t,ll,rr,k;
cin >>ll>>rr>>t;
if(t==1){
cin >>k;
add(1,n,1,ll,rr,k);
}
if(t==2){
find(1,n,1,ll,rr);
cout <<ans<<endl;
ans=0;
}
}
return 0;
}
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
struct node{
long long l,r;
long long sum;
long long lan;
}tree[10000000];
long long L,R;
void on(long long n){
tree[n].sum=tree[n*2].sum+tree[n*2+1].sum;
}
void build(long long l,long long r,long long n){
tree[n].l=l,tree[n].r=r;
if(l==r){
cin >>tree[n].sum;
return;
}
long long mid=(l+r)/2;
build(l,mid,n*2);
build(mid+1,r,n*2+1);
on(n);
return;
}
void down(long long n){
tree[n*2].lan+=tree[n].lan;
tree[n*2+1].lan+=tree[n].lan;
tree[n*2].sum+=(tree[n*2].r-tree[n*2].l+1)*tree[n].lan;
tree[n*2+1].sum+=(tree[n*2+1].r-tree[n*2+1].l+1)*tree[n].lan;
tree[n].lan=0;
return;
}
void add(long long l,long long r,long long n,long long v){
if(L<=l&&r<=R){
tree[n].lan+=v;
tree[n].sum+=(r-l+1)*v;
return;
}
down(n);
long long mid=(l+r)/2;
if(L<=mid)add(l,mid,n*2,v);
if(R>mid)add(mid+1,r,n*2+1,v);
on(n);
return;
}
long long ans=0;
void find(long long l,long long r,long long n){
if(L<=l&&r<=R){
ans+=tree[n].sum;
return;
}
down(n);
long long mid=(l+r)/2;
//cout <<l<<" "<<r<<endl;
if(L<=mid)find(l,mid,n*2);
if(R>mid)find(mid+1,r,n*2+1);
on(n);
}
int main(){
long long n,m;
cin >>n>>m;
build(1,n,1);
for(long long i=1;i<=m;i++){
long long t,k;
ans=0;
cin >>t>>L>>R;
if(t==1){
cin >>k;
add(1,n,1,k);
}else{
find(1,n,1);
cout <<ans<<endl;
}
}
return 0;
}