#include<cstdio>
#define lol long long
using namespace std;
const int nn=1e5+5;
lol n,m,a[nn],tag1[nn<<2],tag2[nn<<2];
struct SegTree{
lol l,r,w;
}seg[nn<<2];
inline bool isdigit(char s){return s>='0'&&s<='9'?true:false;}
inline lol read(){
lol x=0,f=1;char s=getchar();
while(!isdigit(s)){if(s=='-') f=-f;s=getchar();}
while(isdigit(s)){x=(x<<1)+(x<<3)+s-'0';s=getchar();}
return x*f;
}
inline lol dch(lol l,lol r,lol k,lol d){
lol len=r-l+1;lol kn=k+d*(len-1ll);
return 1ll*(k+kn)*len/2;
}
inline void push_up(lol x){seg[x].w=seg[x<<1].w+seg[x<<1|1].w;}
inline void make_tag(lol x,lol k,lol d){
seg[x].w+=dch(seg[x].l,seg[x].r,k,d);
tag1[x]+=k,tag2[x]+=d;
}
inline void build(lol x,lol l,lol r){
seg[x].l=l;seg[x].r=r;
if(l==r){
seg[x].w+=1ll*a[l];
return;
}
lol mid=(l+r)>>1;
build(x<<1,l,mid);build(x<<1|1,mid+1,r);
push_up(x);
}
inline void modify(lol x,lol l,lol r,lol k,lol d){
if(seg[x].l>=l&&seg[x].r<=r){
make_tag(x,(seg[x].l-l)*d+k,d);
return;
}
if(seg[x].l==seg[x].r){
tag1[x]=tag2[x]=0;
return;
}
lol mid=(seg[x].l+seg[x].r)>>1;
if(l<=mid) modify(x<<1,l,r,k,d);
if(r>mid) modify(x<<1|1,l,r,k,d);
}
inline lol query(lol x,lol q){
if(seg[x].l==seg[x].r) return seg[x].w;
lol mid=(seg[x].l+seg[x].r)>>1;
if(!tag1[x]||!tag2[x]){
make_tag(x<<1,tag1[x],tag2[x]);
make_tag(x<<1|1,tag1[x]+(mid+1-seg[x].l)*tag2[x],tag2[x]);
tag1[x]=tag2[x]=0;
}
if(q<=mid) return query(x<<1,q);
else return query(x<<1|1,q);
}
int main(){
n=read();m=read();
for(int i=1;i<=n;i++) a[i]=read();
build(1,1,n);
for(int i=1;i<=m;i++){
lol opt=read();
if(opt%2){
lol l=read(),r=read(),k=read(),d=read();
modify(1,l,r,k,d);
}
else printf("%lld\n",query(1,read()));
}
return 0;
}