#include<iostream>
#define maxn 100005
using namespace std;
int tree[maxn*4],fot[maxn*4],dif[maxn*4],a[maxn];
int n,q;
void build(int u,int L,int R){
if(L==R){
tree[u]=a[L];
return;
}
int M=(L+R)/2;
build(u*2,L,M);
build(u*2+1,M+1,R);
}
void pushdown(int u,int L,int R){
int M=(L+R)/2;
fot[u*2]+=fot[u];
fot[u*2+1]+=fot[u]+(R-M-1)*dif[u];
dif[u*2]+=dif[u];
dif[u*2+1]+=dif[u];
tree[u*2]+=((M-L)*dif[u*2]+fot[u*2]+fot[u*2])*(M-L+1)/2;
tree[u*2+1]+=((R-M-1)*dif[u*2+1]+fot[u*2+1]+fot[u*2+1])*(R-M)/2;
fot[u]=dif[u]=0;
}
void update(int u,int L,int R,int l,int r,int k,int d){
if(l<=L&&R<=r){
fot[u]+=k;
dif[u]+=d;
tree[u]+=((R-L)*dif[u]+fot[u]+fot[u])*(R-L+1)/2;
return;
}
int M=(L+R)/2;
pushdown(u,L,R);
if(l<=M) update(u*2,L,M,l,r,k,d);
else update(u*2+1,M+1,R,l,r,k+(M-L+1)*d,d);
}
int query(int u,int L,int R,int p){
if(L==R){
return tree[u];
}
int M=(L+R)/2;
pushdown(u,L,R);
if(p<=M) return query(u*2,L,M,p);
else return query(u*2+1,M+1,R,p);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(q--){
int opt,x,y,z,h;
cin>>opt;
if(opt==1){
cin>>x>>y>>z>>h;
update(1,1,n,x,y,z,h);
}else{
cin>>x;
cout<<query(1,1,n,x)<<"\n";
}
}
return 0;
}