#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5,MLOGN=N*32;
#define int long long
#define ls lson[now]
#define rs rson[now]
#define mid ((l+r)>>1)
int n,m,a[N];
int root[N],tr[8*N+MLOGN],lson[8*N+MLOGN],rson[8*N+MLOGN],tot;
void pu(int now){
tr[now]=tr[ls]+tr[rs];
}
void build(int &now,int l,int r){
if(!now) now=++tot;
if(l==r){
tr[now]=a[l];
return;
}
build(ls,l,mid);
build(rs,mid+1,r);
pu(now);
}
void insert(int &now,int &las,int l,int r,int v,int d){
if(!now) now=++tot;
if(l==r){
tr[now]=d;
return;
}
if(v<=mid) rs=rson[las],insert(ls,lson[las],l,mid,v,d);
else ls=lson[las],insert(rs,rson[las],mid+1,r,v,d);
pu(now);
}
int query(int &now,int l,int r,int v){
if(l==r) return tr[now];
if(v<=mid) return query(ls,l,mid,v);
return query(rs,mid+1,r,v);
}
void copytree(int &now,int &las){
ls=lson[las],rs=rson[las];
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(root[0],1,n);
for(int i=1;i<=m;i++){
int v,opt,p;
cin>>v>>opt>>p;
if(opt==1){
int d;
cin>>d;
insert(root[i],root[v],1,n,p,d);
}else{
copytree(root[i],root[v]);
cout<<query(root[i],1,n,p)<<"\n";
}
}
return 0;
}