rt
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct tree{
int l,r,v,add;
}t[400005];
int a[100005],b[100005],n,m;
void build(int l,int r,int p){
t[p].l=l,t[p].r=r;
if(l==r){t[p].v=a[l];return;}
int mid=(l+r)>>1;
build(l,mid,p*2);
build(mid+1,r,p*2+1);
t[p].v=t[p*2].v+t[p*2+1].v;
}
void pushdown(int p){
t[p*2].add+=t[p].add;
t[p*2].v+=(t[p*2].r-t[p*2].l+1)*t[p].add;
t[p*2+1].add+=t[p].add;
t[p*2+1].v+=(t[p*2+1].r-t[p*2+1].l+1)*t[p].add;
t[p].add=0;
}
void update(int l,int r,int v,int p){
if(t[p].l>=l&&t[p].r<=r){
t[p].add+=p,t[p].v+=(t[p].r-t[p].l+1)*v;
return;
}
pushdown(p);
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid) update(l,r,v,p*2);
if(r>mid) update(l,r,v,p*2+1);
t[p].v=t[p*2].v+t[p*2+1].v;
}
int query(int l,int r,int p){
if(t[p].l>=l&&t[p].r<=r) return t[p].v;
pushdown(p);
int mid=(t[p].l+t[p].r)>>1,ans=0;
if(l<=mid) ans+=query(l,r,p*2);
if(r>mid) ans+=query(l,r,p*2+1);
return ans;
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=n-1;i>0;i--) a[i+1]-=a[i];
build(1,n,1);
int op,l,r,k,d;
for(int i=1;i<=m;i++){
cin>>op>>l;
if(op==1){
cin>>r>>k>>d;
update(l,l,k,1);
if(l+1<=r) update(l+1,r,d,1);
if(r<n) update(r+1,r+1,(k+(r-l)*d)*(-1),1);
}
else printf("%lld\n",query(1,l,1));
}
return 0;
}