#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 1000010
#define pii pair<int,int>
int n,a[N];
int sum[N],add[N],ls[N],rs[N],tot;
int rt[N];
int clone(int x){
tot++;
sum[tot]=sum[x];
add[tot]=add[x];
ls[tot]=ls[x];
rs[tot]=rs[x];
return tot;
}
int newnode(){
tot++;
return tot;
}
void build(int &pos,int l,int r){
if(!pos)pos=newnode();
if(l==r){
sum[pos]=a[l];
}else{
int mid=l+r>>1;
build(ls[pos],l,mid);
build(rs[pos],mid+1,r);
sum[pos]=sum[ls[pos]]+sum[rs[pos]];
}
}
int change(int pos,int l,int r,int x,int y,int k){
if(y<l||x>r)return pos;
pos=clone(pos);
if(x<=l&&r<=y)add[pos]+=k;
else{
int mid=l+r>>1;
sum[pos]+=(min(r,y)-max(l,x)+1)*k;
ls[pos]=change(ls[pos],l,mid,x,y,k);
rs[pos]=change(rs[pos],mid+1,r,x,y,k);
}
return pos;
}
int query(int pos,int l,int r,int x,int y){
if(y<l||x>r)return 0;
if(x<=l&&r<=y)return sum[pos]+add[pos]*(r-l+1);
else{
int mid=l+r>>1;
int ans=add[pos]*(min(r,y)-max(l,x)+1);
ans+=query(ls[pos],l,mid,x,y);
ans+=query(rs[pos],mid+1,r,x,y);
return ans;
}
}
void print(int x){
for(int i=1;i<=n;i++){
cerr<<query(rt[x],1,n,i,i)<<' ';
}
cerr<<'\n';
}
signed main(){
cin>>n;
int q;
cin>>q;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(rt[0],1,n);
for(int i=1;i<=q;i++){
int v,t;
scanf("%lld%lld",&v,&t);
if(t==1){
int x,y,k;
scanf("%lld%lld",&x,&k);
rt[i]=change(rt[v],1,n,x,x,k);
}else if(t==2){
int x,y;
scanf("%lld",&x);
rt[i]=rt[v];
printf("%lld\n",query(rt[v],1,n,x,x));
}else if(t==3){
print(v);
}
}
for(int i=0;i<=q;i++){
cerr<<'&',print(i);
}
return 0;
}