#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
struct node{
int ls, rs, ans;
}tree[maxn << 5];
int n, m, tot, rt[maxn];
int Build(int l, int r){
int root = ++tot;
if(l == r){
scanf("%d", &tree[root].ans);
return root;
}
int mid = (l + r) >> 1;
tree[root].ls = Build(l, mid);
tree[root].rs = Build(mid + 1, r);
return root;
}
int UpDate(int root, int l, int r, int vis, int pos){
int c = ++tot;
tree[c].ls = tree[root].ls;
tree[c].rs = tree[root].rs;
if(l == r){
tree[c].ans = pos;
return c;
}
int mid = (l + r) >> 1;
if(vis <= mid) tree[c].ls = UpDate(tree[c].ls, l, mid, vis, pos);
else tree[c].rs = UpDate(tree[c].rs, mid + 1, r, vis, pos);
return c;
}
int Query(int root, int l, int r, int vis){
if(l == r) return tree[root].ans;
int mid = (l + r) >> 1;
if(vis <= mid) return Query(tree[root].ls, l, mid, vis);
else return Query(tree[root].rs, mid + 1, r, vis);
}
int main(){
scanf("%d%d", &n, &m);
rt[0] = Build(1, n);
int k, op, vis, pos, cnt = 1;
while(m--){
scanf("%d%d", &k, &op);
if(op == 1){
scanf("%d%d", &vis, &pos);
rt[cnt++] = UpDate(rt[k], 1, n, vis, pos);
}
else{
scanf("%d", &vis);
rt[cnt++] = rt[k];
printf("%d\n", Query(rt[k], 1, n, vis));
}
}
return 0;
}