#include<bits/stdc++.h>
#define maxn 1000001
using namespace std;
int n,m,root[maxn],f[maxn],cnt=0;
struct nod{
int l,r,x;
}t[40*maxn];
int build(int l,int r){
int num=++cnt;
if(l==r)t[num].x=f[l];
else{
t[num].l=build(l,(l+r)/2);
t[num].r=build((l+r)/2+1,r);
}
return num;
}
void chg(int l,int r,int p,int x,int pre,int &now){
now=++cnt;
t[now]=t[pre];
int mid=(l+r)>>1;
if(l==r)t[now].x=x;
else{
if(p<=mid)chg(l,mid,p,x,t[pre].l,t[now].l);
else chg(mid+1,r,p,x,t[pre].l,t[now].r);
}
}
int query(int l,int r,int p,int now){
int mid=(l+r)>>1;
if(l==r)return t[now].x;
else{
if(p<=mid)return query(l,mid,p,t[now].l);
else return query(mid+1,r,p,t[now].r);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%d",&f[i]);
}
root[0]=build(1,n);
for(int i=1;i<=m;i++){
int ver,opt,pos,val;
scanf("%d%d%d",&ver,&opt,&pos);
if(opt==1){
scanf("%d",&val);
chg(1,n,pos,val,root[ver],root[i]);
}
else{
root[i]=root[ver];
cout<<query(1,n,pos,root[ver])<<endl;
}
}
}