#include<iostream>
using namespace std;
struct node{
int l,r,dat;//,lazy;
node &operator =(node b){
l=b.l,r=b.r,dat=b.dat;
return *this;
}
};
node dta[32000001];
int a[1000001];
int root[1000001];
int k=1;
void pushup(node &a){
a.dat=dta[a.l].dat+dta[a.r].dat;
}
void build(int id,int l,int r){
if(l==r){
dta[id].dat=a[l];
// cout<<id<<'\n';
return ;
}
// cout<<l<<'\t'<<r<<'\t'<<id<<'\n';
int mid=(l+r)>>1;
build(dta[id].l=k++,l,mid);
build(dta[id].r=k++,mid+1,r);
// pushup(dta[id]);
}
void replace(int id,int l,int r,int x,int val){
dta[k]=dta[id];
// cout<<id<<'\t';
// cout<<dta[id].r<<'\t';
// cout<<dta[k].r<<'\n';
id=k++;
// cout<<l<<'\t'<<r<<'\t'<<id<<'\n';
// cout<<dta[id].r<<'\n';
if(l==r){
dta[id].dat=val;
return ;
}
int mid=(l+r)>>1;
if(mid>=x){
replace(dta[id].l,l,mid,x,val);
}
else{
replace(dta[id].r,mid+1,r,x,val);
}
}
int ask(int id,int l,int r,int x){
// cout<<l<<'\t'<<r<<'\t'<<x<<'\n';
// cout<<id<<'\n';
if(l==r)return dta[id].dat;
int mid=(l+r)>>1;
if(mid>=x){
return ask(dta[id].l,l,mid,x);
}
else return ask(dta[id].r,mid+1,r,x);
}
int n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
root[0]=k++;
build(1,1,n);
for(int i=1;i<=m;i++){
int v,op,p,c;
cin>>v>>op>>p;
if(op==1){
cin>>c;
root[i]=k;
replace(root[v],1,n,p,c);
}
else{
root[i]=root[v];
cout<<ask(root[v],1,n,p)<<'\n';
}
}
return 0;
}