#include<bits/stdc++.h>
#define MAXN 1000005
using namespace std;
inline int read(){
int s=0,t=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') t=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
s=s*10+c-'0';c=getchar();
}
return s*t;
}
inline void write(int p){
if(p<0){
putchar('-');p=-p;
}
if(p<10){
putchar(p+'0');return;
}
write(p/10);putchar(p%10+'0');
}
struct node{
int s,ls,rs;
}t[MAXN<<5];
int a[MAXN],root[MAXN],tot=0;
inline void build(int &rt,int l,int r){
if(!rt) rt=++tot;
if(l==r){
t[rt].s=a[l];return;
}
int mid=(l+r)>>1;
build(t[rt].ls,l,mid);build(t[rt].rs,mid+1,r);
t[rt].s=t[t[rt].ls].s+t[t[rt].rs].s;
}
inline void update(int rt1,int rt2,int l,int r,int loc,int value){
if(l==r){
t[rt1].s=value;return;
}
t[rt1].ls=t[rt2].ls;t[rt1].rs=t[rt2].rs;
int mid=(l+r)>>1;
if(loc<=mid){
t[rt1].ls=++tot;update(t[rt1].ls,t[rt2].ls,l,mid,loc,value);
}
else{
t[rt2].rs=++tot;update(t[rt1].rs,t[rt2].rs,mid+1,r,loc,value);
}
t[rt1].s=t[t[rt1].ls].s+t[t[rt1].rs].s;
}
inline int query(int rt,int l,int r,int pos){
if(l==r) return t[rt].s;
int mid=(l+r)>>1;
if(pos<=mid) return query(t[rt].ls,l,mid,pos);
else return query(t[rt].rs,mid+1,r,pos);
}
int main(){
int n,m,p=0,v,op,l,w;
n=read();m=read();
for(register int i=1;i<=n;++i) a[i]=read();
build(p,1,n);root[0]=1;
for(register int i=1;i<=m;++i){
v=read();op=read();l=read();
if(op==1){
w=read();root[i]=++tot;
update(root[i],root[v],1,n,l,w);
}
else{
root[i]=root[v];
write(query(root[v],1,n,l));
putchar('\n');
}
}
return 0;
}