rt
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define int ll
const int maxn=1e5+10;
int n,m,sum[maxn<<2],add[maxn<<2],a[maxn];
inline int read() {
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
inline void push_up(int root) {
sum[root]=sum[root<<1]+sum[root<<1|1];
} // 更新点信息
inline void build(int l,int r,int root) {
if(l==r) {
sum[root]=a[l];
return;
}
int m=(l+r)>>1;
build(l,m,root<<1);
build(m+1,r,root<<1|1);
push_up(root);
} // 建树
inline void push_down(int root,int ln,int rn) {
if(add[root]) {
add[root<<1]+=add[root];
add[root<<1|1]+=add[root];
sum[root<<1]+=add[root]*ln;
sum[root<<1|1]+add[root]*rn;
add[root]=0;
}
} // 下推标记
inline void update_sec(int L,int R,int c,int l,int r,int root) {
if(L<=l&&R>=r) {
sum[root]+=c*(r-l+1);
add[root]+=c;
return;
}
int m=(l+r)>>1;
push_down(root,m-l+1,r-m);
if(L<=m) update_sec(L,R,c,l,m,root<<1);
if(R>m) update_sec(L,R,c,m+1,r,root<<1|1);
push_up(root);
} // 区间修改 a[L,R]+=c;
inline int query(int L,int R,int l,int r,int root) {
if(l==r) return sum[root];
int m=(l+r)>>1,ans=0;
if(L<=m) ans+=query(L,R,l,m,root<<1);
if(R>m) ans+=query(L,R,m+1,r,root<<1|1);
return ans;
} // 区间查询
signed main() {
// freopen("segtree.in","r",stdin);
// freopen("segtree.out","w",stdout);
build(1,n,1);
n=read(),m=read();
for(int i=1;i<=n;++i) a[i]=read();
while(m--) {
int k=read(),l,r,c;
if(k==1) {
l=read(),r=read(),c=read();
update_sec(l,r,c,1,n,1);
}
else {
l=read(),r=read();
printf("%lld\n",query(l,r,1,n,1));
}
}
return 0;
}