RT
#include<bits/stdc++.h>
using namespace std;
#define For(i,a,b) for(int i = a;i<=b;i++)
template<typename T = int>
inline T read(){
register T r = 0,f = 1;
register char c = getchar();
while(c < '0' || c > '9'){
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0'&& c<='9'){
r = (r<<1)+(r<<3) - '0' + c;
c = getchar();
}
return f*r;
}
typedef long long LL;
const int N = 1000000 + 5,M = 100010 ,INF = 0x3f3f3f3f;
int n,m;
int a[N];
int root[N],idx;
struct Node{
int l,r;
int val;
}tr[N * 20];
int build(int l,int r){
int p = ++idx,mid = l +r >>1;
if(l == r){
tr[p].val = a[l];
return p;
}
tr[p].l = build(l,mid);
tr[p].r = build(mid+1,r);
return p;
}
int updata(int pre,int l,int r,int x,int v){
int p = ++idx,mid = l + r >>1;
tr[p] = tr[pre];
if(l == r) {
tr[p].val = v;
return p;
}
if(x <= mid) tr[p].l = updata(tr[pre].l,l,mid,x,v);
else tr[p].r = updata(tr[pre].r,mid+1,r,x,v);
return p;
}
int query(int pre,int l,int r,int x){
if(l == r){
return tr[pre].val;
}
int mid = l + r >>1;
if(x <= mid) return query(tr[pre].l,l,mid,x);
else return query(tr[pre].r,mid+1,r,x);
}
int main(){
n = read();m = read();
For(i,1,n) a[i] = read();
root[0] = build(1,n);
For(i,1,m){
int vv,ty,pos,val;
vv = read(),ty = read();
if(ty == 1){
pos = read(),val = read();
root[i] = updata(root[vv],1,n,pos,val);
}
else{
pos = read();
cout<<query(root[vv],1,n,pos)<<'\n';
}
}
system("pause");
return 0;
}