#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1e5*8+1;
#define ll long long
long long tree[maxn],tag[maxn];
int n,m,a,b,d,opt;
ll c;
void pushdown(int rt,int l,int r){
tree[rt]+=tag[rt]*(r-l+1);
tag[rt<<1]+=tag[rt];
tag[rt<<1|1]+=tag[rt];
tag[rt]=0;
}
void pushup(int rt,int l,int r){
ll mid=((l+r)>>1);
pushdown(rt,l,r);
pushdown(rt<<1,l,r);
pushdown(rt<<1|1,l,r);
tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}
void update(int rt,int L,int R,int l,int r,ll val){
pushdown(rt,L,R);
ll mid=((L+R)>>1);
if(L>=l&&R<=r){
tree[rt]+=val;
return;
}
if(l<=mid){
update(rt<<1,L,mid,l,r,val);
}
if(r>mid){
update(rt<<1|1,mid+1,R,l,r,val);
}
pushup(rt,L,R);
}
ll quary(int rt,int l,int r,int L,int R){
int mid=((l+r)>>1);
pushdown(rt,l,r);
ll ans=0;
if(l>=L&&r<=R){
return tree[rt];
}
if(mid>=L){
ans+=quary(rt<<1,l,mid,L,R);
}
if(R>mid){
ans+=quary(rt<<1|1,mid+1,r,L,R);
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&c);
update(1,1,n,i,i,c);
}
for(int i=1;i<=m;i++){
scanf("%d",&opt);
if(opt==1){
scanf("%d%d%lld",&a,&b,&c);
update(1,1,n,a,b,c);
}else{
scanf("%d%d",&a,&b);
printf("%lld\n",quary(1,1,n,a,b));
}
}
return 0;
}