#include<iostream>
#define maxn 100005
#define LL long long
using namespace std;
LL n,m;
LL w[maxn*4],tagk[maxn*4],tagd[maxn*4],a[maxn];
void pushup(LL u){
w[u]=w[u*2]+w[u*2+1];
}
bool InRange(LL L,LL R,LL l,LL r){
//判断区间[L,R]是否完全在[l,r]内
return (l<=L)&&(R<=r);
}
bool OutofRange(LL L,LL R,LL l,LL r){
//判断区间[L,R]是否与[l,r]无交集
return (R<l)||(L>r);
}
LL sumary(LL len,LL tk,LL td){
LL tn=(len-1)*td+tk;
return (tk+tn)*len/2;
}
void maketag(LL u,LL len,LL tk,LL td){
w[u]+=sumary(len,tk,td);
tagk[u]+=tk;
tagd[u]+=td;
}
void pushdown(LL u,LL L,LL R){
LL M=(L+R)/2;
maketag(u*2,M-L+1,tagk[u],tagd[u]);
maketag(u*2+1,R-M,tagk[u]+(M-L+1)*tagd[u],tagd[u]);
tagk[u]=tagd[u]=0;
}
void build(LL u,LL L,LL R){
if(L==R){
w[u]=a[L];
return;
}
LL M=(L+R)/2;
build(u*2,L,M);
build(u*2+1,M+1,R);
pushup(u);
}
LL query(LL u,LL L,LL R,LL p){//查找第p个数的值
if(L==R){
return w[u];
}
pushdown(u,L,R);
LL M=(L+R)/2;
if(p<=M){
return query(u*2,L,M,p);
}
return query(u*2,M+1,R,p);
}
void update(LL u,LL L,LL R,LL l,LL r,LL tk,LL td){
if(InRange(L,R,l,r)){
maketag(u,R-L+1,tk,td);
return;
}else if(!OutofRange(L,R,l,r)){
LL M=(L+R)/2;
pushdown(u,L,R);
update(u*2,L,M,l,r,tk,td);
update(u*2,M+1,R,l,r,tk,td);
pushup(u);
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(LL i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
LL opt,l,r,k,d,p;
cin>>opt;
if(opt==1){
cin>>l>>r>>k>>d;
update(1,1,n,l,r,k,d);
}else{
cin>>p;
cout<<query(1,1,n,p)<<"\n";
}
}
return 0;
}