rt
#include<bits/stdc++.h>
using namespace std;
struct tre{
int l,r,add;
long long x;
}tree[2000006];
int a[500004];
void build(int x,int l,int r){
tree[x].l=l;tree[x].r=r;
if(l==r){
tree[x].x=a[l];
return;
}
int mid((tree[x].l+tree[x].r)/2);
build(x*2,l,mid);
build(x*2+1,mid+1,r);
tree[x].x=tree[x*2].x+tree[x*2+1].x;
}
void p_d(int x){
if(tree[x].add){
tree[x*2].add+=tree[x].add;
tree[x*2+1].add+=tree[x].add;
tree[x*2].x+=(tree[x].add*(tree[x*2].r-tree[x*2].l+1));
tree[x*2+1].x+=(tree[x].add*(tree[x*2+1].r-tree[x*2+1].l+1));
tree[x].add=0;
}
}
void update(int x,int k,int l,int r){
if(tree[x].l>=l&&tree[x].r<=r){
tree[x].x+=k*(tree[x].r-tree[x].l+1);
tree[x].add+=k;
return;
}
else{
p_d(x);
int mid=(tree[x].r+tree[x].l)>>1;
if(l<=mid)update(x*2,k,l,r);
if(r>mid)update(x*2+1,k,l,r);
tree[x].x=tree[x*2].x+tree[x*2+1].x;
}
}
long long query(int x,int l,int r){
if(l<=tree[x].l&&r>=tree[x].r) return tree[x].x;
p_d(x);
int mid=((tree[x].r+tree[x].l)>>1);
long long sum=0;
if(l<=mid)sum+=query(x*2,l,r);
if(r>mid)sum+=query(x*2+1,l,r);
return sum;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
// cout<<a[i]<<' ';
}
build(1,1,n);//cout<<1111;
for(int i=1;i<=m;i++){
long long b,c,d;
char ch;
cin>>ch;
if(ch=='1')
scanf("%lld%lld%lld",&b,&c,&d);
else scanf("%lld%lld",&b,&c);
if(ch=='1'){
update(1,d,b,c);
}
else{
printf("%lld\n",query(1,b,c));
}
}
}