#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; }