#include<cstdio> using namespace std; int const maxn = 1e6; int n, m; long long sum[4 * maxn + 5], input[maxn+5], add[maxn * 4 + 5]; inline void build(int k, int l, int r) { if(l==r) { sum[k] = input[l]; return; } int mid = (l+r)>>1; build(k<<1,l,mid); build((k<<1)+1,mid+1,r); sum[k] = sum[k<<1] + sum[(k<<1)+1]; return; } inline void dotchange(int k, int l, int r, int x, int v) { if(l==r) { sum[k] += v; return; } int mid = (l+r) >> 1; if(x <= mid) { dotchange(k<<1,l,mid,x,v); } else { dotchange((k<<1)+1,mid+1,r,x,v); } sum[k] = sum[k<<1] + sum[(k<<1)+1]; } inline int dotquery(int k, int l, int r, int x) { if(l==x) { return sum[k]; } int mid = (l+1) >> 1; if(x <= mid) { return dotquery(k<<1,l,mid,x); } else { return dotquery((k<<1+1),mid+1,r,x); } } void Add(int k, int l, int r, int v) { add[k] += v; sum[k] += (r-l+1)*v; return; } void pushdown(int k, int l, int r,int mid) { if(add[k] == 0) return; Add(k<<1,l,mid,add[k]); Add((k<<1)+1,mid+1,r,add[k]); add[k] = 0; } void longchange(int k, int l, int r, int x, int y, int v) { if(x<=l && r<=y) { Add(k,l,r,v); return; } int mid = (l+r)>>1; pushdown(k,l,r,mid); if(x<=mid) { longchange(k<<1,l,mid,x,y,v); } if(y>=mid+1) { longchange((k<<1)+1,mid+1,r,x,y,v); } sum[k] = sum[k<<1] + sum[(k<<1)+1]; } long long longquery(int k, int l, int r, int x, int y) { if(x<=l && r<=y) { return sum[k]; } int mid = (l+r) >> 1; pushdown(k,l,r,mid); long long res = 0; if(x<=mid) { res += longquery(k<<1,l,mid,x,y); } if(y>=mid+1) { res += longquery((k<<1)+1,mid+1,r,x,y); } sum[k] = sum[k<<1] + sum[(k<<1)+1]; return res; } int main() { scanf("%d%d", &n, &m); for(int i = 1;i <= n;i++) { scanf("%d", &input[i]); } build(1,1,n); for(int q = 1;q <= m;q++) { int a, b, c, d; scanf("%d", &a); if(a == 1) { scanf("%d%d%d", &b,&c,&d); longchange(1,1,n,b,c,d); } else { scanf("%d%d", &b, &c); printf("%lld\n", longquery(1,1,n,b,c)); } } return 0; }