#include<bits/stdc++.h>
using namespace std;
long long n,m,a[100005],tree[800005],tree1[800005],tree2[800005];
void build(int id,int l,int r){
tree1[id]=0;
tree2[id]=0;
if(l==r){
tree[id]=a[l];
return ;
}
int mid=(l+r)/2;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
return ;
}
void push_dow(int id,int l,int r,int mid){
tree1[id<<1]+=tree1[id];
tree2[id<<1]+=tree2[id];
tree1[id<<1|1]+=tree1[id]+(mid-l+1)*tree2[id];
tree2[id<<1|1]+=tree2[id];
tree1[id]=0;
tree2[id]=0;
return ;
}
void mdy(int id,int l,int r,int x,int y,int k,int d){
if(x>r||y<l)
return ;
if(l>=x&&r<=y){
tree1[id]+=k;
tree2[id]+=d;
int mx=(r-l)*tree2[id]+tree1[id];
tree[id]+=(tree1[id]+mx)*(r-l+1)/2;
return ;
}
int mid=(l+r)/2;
push_dow(id,l,r,mid);
mdy(id<<1,l,mid,x,y,k,d);
if(mid-x==0)
mdy(id<<1|1,mid+1,r,x,y,k,d);
else
mdy(id<<1|1,mid+1,r,x,y,k+(mid-x+1)*d,d);
return ;
}
long long qry(int id,int l,int r,int x){
if(x>r||x<l)
return -1e8;
if(l==r&&l==x)
return tree[id];
int mid=(l+r)/2;
push_dow(id,l,r,mid);
return max(qry(id<<1,l,mid,x),qry(id<<1|1,mid+1,r,x));
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
while(m--){
int x,y,k,d,op;
cin>>op;
if(op==1){
cin>>x>>y>>k>>d;
mdy(1,1,n,x,y,k,d);
}
else{
cin>>x;
cout<<qry(1,1,n,x)<<'\n';
}
}
return 0;
}