#include<iostream>
#include<cstdio>
#include<cstdlib>
#define maxn 1000010
using namespace std;
template<typename T>
inline void read(T &x){
x=0;bool flag=0;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') flag=1;
for(;isdigit(c);c=getchar()) x=x*10+(c^48);
if(flag) x=-x;
}
int n,m,a[maxn],num,v,loc,value;
int cnt,root[20*maxn],ls[20*maxn],rs[20*maxn],val[20*maxn];
void build(int &t,int l,int r){//注意要取地址
t=++cnt;
if(l==r){
val[t]=a[l];
return ;
}
int mid=(l+r)/2;
build(ls[t],l,mid);
build(rs[t],mid+1,r);
}
void change(int &t,int k,int l,int r,int pos,int v){//注意要取地址
t=++cnt;
ls[t]=ls[k];rs[t]=rs[k];val[t]=val[k];
if(l==r){
val[t]=v;
return ;
}
int mid=(l+r)/2;
if(pos<=mid) change(ls[t],ls[k],l,mid,pos,v);
if(pos>mid) change(rs[t],rs[k],mid+1,r,pos,v);
}
int query(int t,int l,int r,int pos){
if(l==r) return val[t];
int mid=(l+r)/2;
if(pos<=mid) return query(ls[t],l,mid,pos);
if(pos>mid) return query(rs[t],mid+1,r,pos);
}
int main(){
read(n),read(m);
for(int i=1;i<=n;i++) read(a[i]);
build(root[0],1,n);
for(int i=1;i<=m;i++){
read(v),read(num),read(loc);
if(num==1){
read(value);
change(root[i],root[v],1,n,loc,value);
}
if(num==2){
cout<<query(root[v],1,n,loc)<<endl;
root[i]=root[v];
}
}
return 0;
}