#include<iostream>
using namespace std;
const int N=1000005;
struct DynamicTree{
int l,r,val;
}t[30*N];
int top=0,root[N],n,m,a[N],v,o,loc,value;
int clone(int p){
t[++top]=t[p];
return top;
}
int build(int p,int l,int r){
p=++top;
if(l==r){
t[p].val=a[l];
return top;
}
else{
int mid=(l+r)/2;
t[p].l=build(t[p].l,l,mid);
t[p].r=build(t[p].r,mid+1,r);
}
return p;
}
int update(int p,int l,int r,int x,int k){
p=clone(p);
if(l==r)t[p].val=k;
else{
int mid=(l+r)/2;
if(x<=mid)t[p].l=update(t[p].l,l,mid,x,k);
if(x>mid)t[p].r=update(t[p].r,mid+1,r,x,k);
}
return p;
}
int que(int p,int l,int r,int x){
if(l==r)return t[p].val;
else{
int mid=(l+r)/2;
if(x<=mid)return que(t[p].l,l,mid,x);
if(x>mid)return que(t[p].r,mid+1,r,x);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
root[0]=build(0,1,n);
for(int i=1;i<=m;i++){
cin>>v>>o>>loc;
if(o==1){
cin>>value;
root[i]=update(root[v],1,n,loc,value);
}
else if(o==2){
cout<<que(root[v],1,n,loc)<<endl;
root[i]=root[v];
}
}
return 0;
}
最后一个点持续TLE,求大佬给查个问题