// 洛谷: https://www.luogu.org/problemnew/show/P3919
#include <bits/stdc++.h> using namespace std; const int maxn = 1e6+500; #define lson rt->left #define rson rt->right struct nobe { int val; nobe *left; nobe *right; nobe () { val = 0; left = right = NULL; } }; int date[maxn]; nobe *head[maxn]; void build(int l, int r, nobe* rt) { if (l == r) { rt->val = date[l]; return ; } rt->left = new nobe(); rt->right = new nobe(); int m = (l + r) / 2; build(l, m, lson); build(m+1, r, rson); } int query(int l, int r, int id, nobe *rt) { if (l==id && r==id) return rt->val; int mid = (l + r) / 2; if (id <= mid) return query(l, mid, id, lson); return query(mid+1, r, id, rson); } void update(int l, int r, int id, int val, nobe *rt, nobe *nrt) { nrt->val = rt->val; nrt->left = lson; nrt->right = rson; if (l==id && r==id) { nrt->val = val; return ; } int mid = (l + r) / 2; if (id <= mid) { nrt->left = new nobe(); update(l, mid, id, val, lson, nrt->left); } else { nrt->right = new nobe(); update(mid+1, r, id, val, rson, nrt->right); } } int main() { // freopen("E:\\output.txt", "w", stdout); // freopen("E:\\input.txt", "r", stdin); int n, m, i, j; scanf("%d%d", &n, &m); for (i=1; i<=n; ++i) scanf("%d", date+i); head[0] = new nobe(); build(1, n, head[0]); int vs, op, id, val; for (i=1; i<=m; ++i) { scanf("%d%d%d", &vs, &op, &id); if (op == 1) { scanf("%d", &val); head[i] = new nobe(); update(1, n, id, val, head[vs], head[i]); } else if (op == 2) { head[i] = head[vs]; printf("%d\n", query(1, n, id, head[vs])); } } return 0; }