#include<bits/stdc++.h>
using namespace std;
int n,m,f,x,y,k,a[100001];
struct node{
int l,r;
int s,tag;
}tree[400006];
void build(long long x,long long l,long long r){
tree[x].l=l;
tree[x].r=r;
if(l==r){
tree[x].s=a[l];
}else{
int mid=(l+r)>>1;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
tree[x].s=tree[x*2].s+tree[x*2+1].s;
}
}
long long query(long long x,long long l,long long r,long long ql,long long qr){
if(l==ql&&r==qr)return tree[x].s+(r-l+1)*tree[x].tag;
int mid=(l+r)>>1;
if(qr<=mid)return query(x*2,l,mid,ql,qr);
else if(ql>mid)return query(x*2+1,mid+1,r,ql,qr);
else return query(x*2,l,mid,ql,mid)+query(x*2+1,mid+1,r,mid+1,qr);
}
void push_down(long long x,long long l,long long r,long long ql,long long qr,long long k){
if(l==ql&&r==qr){
tree[x].tag+=k;
return ;
}
int mid=(l+r)>>1;
if(qr<=mid)push_down(x*2,l,mid,ql,qr,k);
else if(ql>mid)push_down(x*2+1,mid+1,r,ql,qr,k);
else{
push_down(x*2,l,mid,ql,mid,k);
push_down(x*2+1,mid+1,r,mid+1,qr,k);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
build(1,1,n);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&f,&x,&y);
if(f==1){
scanf("%d",&k);
push_down(1,1,n,x,y,k);
}else{
printf("%d\n",query(1,1,n,x,y));
}
}
return 0;
}