#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
struct TREE{
int l,r,sum;
}tree[4*N];
int input[N];
int ans;
inline void build(int i,int l,int r){
tree[i].l=l;tree[i].r=r;
if(l==r){
tree[i].sum=input[l];
return;
}
int mid=(l+r)>>1;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;
}
inline int search_interval(int i,int l,int r){
int sm=0;
if(tree[i].l>=l&&tree[i].r<=r)return tree[i].sum;
if(tree[i].l>r||tree[i].r<l)return 0;
if(tree[i].l<=r)sm+=search_interval(i*2,l,r);
if(tree[i].r>=l)sm+=search_interval(i*2+1,l,r);
}
inline int edd(int i,int dis,int k){
if(tree[i].l==tree[i].r)tree[i].sum+=k;
if(dis<=tree[i*2].r)edd(i*2,dis,k);
else edd(i*2+1,dis,k);
tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;
}
inline void edd_interval(int i,int l,int r,int k){
if(tree[i].l>=l&&tree[i].r<=r){
tree[i].sum+=k;
return ;
}
if(tree[i*2].r>=l)edd_interval(i*2,l,r,k);
if(tree[i*2+1].l<=r)edd_interval(i*2+1,l,r,k);
}
inline void search_point(int i,int dis){
ans+=tree[i].sum;
if(tree[i].l==tree[i].r){
return ;
}
if(tree[i*2].r>=dis)search_point(i*2,dis);
if(dis>=tree[i*2+1].l)search_point(i*2+1,dis);
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>input[i];
}
build(1,1,n);
while(m--){
int in;
cin>>in;
in--;
int x,y,k;
cin>>x;
if(in){
ans=0;
search_point(1,x);
cout<<ans<<'\n';
}
else {
cin>>y>>k;
edd_interval(1,x,y,k);
}
}
return 0;
}