#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
int n,m,tree[N*4],lazy[N*4];
#define ls k<<1
#define rs k<<1|1
int read();
void write(int);
void pushdown(int k,int l,int r){
if(!lazy[k]) return;
int mid=(l+r)>>1;
lazy[ls]+=lazy[k];
lazy[rs]+=lazy[k];
tree[ls]+=(mid-l+1)*lazy[k];
tree[rs]+=(r-mid)*lazy[k];
lazy[k]=0;
}
void build(int k,int l,int r){
if(l==r){
tree[k]=read();
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
tree[k]=tree[ls]+tree[rs];
}
int query(int k,int l,int r,int x,int y){
if(x>r||y<l) return 0;
if(x<=l&&y>=r) return tree[k];
pushdown(k,l,r);
int mid=(l+r)>>1;
return query(ls,l,mid,x,y)+query(rs,mid+1,r,x,y);
}
void update(int k,int l,int r,int x,int y,int v){
if(x>r||y<l) return;
if(x<=l&&y>=r){
tree[k]+=(r-l+1)*v;
lazy[k]+=v;
return;
}
pushdown(k,l,r);
int mid=(l+r)>>1;
if(x<=mid) update(ls,l,mid,x,y,v);
if(x>mid) update(rs,mid+1,r,x,y,v);
tree[k]=tree[ls]+tree[rs];
}
signed main(){
n=read(); m=read();
build(1,1,n);
while(m--){
int op=read(),x=read(),y,v;
if(op==1){
y=read();
v=read();
update(1,1,n,x,y,v);
}
else{
y=read();
write(query(1,1,n,x,y));
puts("");
}
}
return 0;
}
int read(){
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void write(int x){
if(x<0){putchar('-');x=-x;}
if(x>9) write(x/10);
putchar(x%10+'0');
}