#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
struct node
{
int l,r,sum;
int tag;
}tree[4*N];
int n,m,a[N],opt,l,r,k,d;
void build(int x,int y,int p)
{
tree[p].l=x,tree[p].r=y;
if(x==y)
{
tree[p].sum=a[x];
return ;
}
int mid=x+y>>1;
build(x,mid,p<<1);
build(mid+1,y,p<<1|1);
tree[p].sum=tree[p<<1].sum+tree[p<<1|1].sum;
}
void pushdown(int p)
{
if(tree[p].tag)
{
tree[p<<1].sum+=(tree[p<<1].r-tree[p<<1].l+1)*tree[p].tag;
tree[p<<1|1].sum+=(tree[p<<1|1].r-tree[p<<1|1].l+1)*tree[p].tag;
tree[p<<1].tag+=tree[p].tag;
tree[p<<1|1].tag+=tree[p].tag;
tree[p].tag=0;
}
}
void update(int x,int y,int z,int p)
{
if(tree[p].l>=x && tree[p].r<=y)
{
tree[p].sum+=(tree[p].r-tree[p].l+1)*z;
tree[p].tag+=z;
return ;
}
pushdown(p);
int mid=tree[p].l+tree[p].r>>1;
if(x<=mid) update(x,y,z,p<<1);
if(y>mid) update(x,y,z,p<<1|1);
tree[p].sum=tree[p<<1].sum+tree[p<<1|1].sum;
}
int query(int x,int y,int p)
{
if(tree[p].l>=x && tree[p].r<=y)
{
return tree[p].sum;
}
pushdown(p);
int res=0,mid=tree[p].l+tree[p].r>>1;
if(x<=mid) res+=query(x,y,p<<1);
if(y>mid) res+=query(x,y,p<<1|1);
return res;
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=n-1;i>0;i--)
a[i+1]=a[i+1]-a[i];
build(1,n,1);
for(int i=1;i<=m;i++)
{
cin>>opt;
if(opt==1)
{
cin>>l>>r>>k>>d;
update(l,l,k,1);
update(l+1,r,d,1);
int e=k+(r-l+1)*d;
update(r+1,r+1,-e,1);
}
else
{
cin>>l;
cout<<query(1,l,1)<<endl;
}
}
}