#include<iostream>
using namespace std;
const int N=100005;
struct node{
int l,r;
int lazy_tag,d;
}t[4*N];
int a[N];
void build(int p,int l,int r){
t[p].l=l;
t[p].r=r;
if(l==r){
t[p].d=a[l];
return;
}
int mid=(l+r)/2;
build(p*2,l,mid);
build(p*2,mid+1,r);
t[p].d=t[p*2].d+t[p*2+1].d;
}
int query(int p,int l,int r){
if(t[p].l==l&&t[p].r==r){
return t[p].d;
}
int mid=(l+r)/2;
if(r<=mid){
return query(p*2,l,r);
}
else if(l>=mid+1){
return query(p*2+1,l,r);
}
else{
return query(p*2,l,mid)+query(p*2+1,mid+1,r);
}
}
int get_d(int p){
return t[p].d+t[p].lazy_tag*(t[p].r-t[p].l+1);
}
void pushdown(int p){
if(t[p].lazy_tag==0)
return;
t[p].d=get_d(p);
t[p*2].lazy_tag+=t[p].lazy_tag;
t[p*2+1].lazy_tag+=t[p].lazy_tag;
t[p].lazy_tag=0;
}
void change(int p,int l,int r,int x){
if(t[p].l==l&&t[p].r==r){
t[p].lazy_tag+=x;
return;
}
pushdown(p);
int mid=(l+r)/2;
if(r<=mid){
change(p*2,l,r,x);
}
else if(l>=mid+1){
change(p*2+1,l,r,x);
}
else{
change(p*2,l,mid,x);
change(p*2+1,mid+1,r,x);
}
t[p].d=get_d(p*2)+get_d(p*2+1);
}
int main(){
int n,m,c,x,y,k;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
cin>>c;
if(c==1){
cin>>x>>y>>k;
change(1,x,y,k);
}
else{
cin>>x>>y;
cout<<query(1,x,y)<<endl;
}
}
return 0;
}