调了好久,改了又改
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int n, m, root[N], cnt;
struct tree {
int lc, rc, val;
} t[20 * N];
int build(int l, int r) {
int p = ++cnt;
if (l == r) {
scanf("%d", &t[p].val);
return p;
}
int mid = (l + r) >> 1;
t[p].lc = build(l, mid);
t[p].rc = build(mid + 1, r);
return p;
}
int insert(int now, int l, int r, int x, int val) {
int p = ++cnt;
t[p] = t[now];
if (l == r) {
t[p].val = val;
return p;
}
int mid = (l + r) >> 1;
if (x <= mid) t[p].lc = insert(t[now].lc, l, mid, x, val);
else t[p].rc = insert(t[now].rc, mid + 1, r, x, val);
return cnt;
}
int ask(int p, int l, int r, int x) {
if (l == r) return t[p].val;
int mid = (l + r) >> 1;
if (x <= mid) return ask(t[p].lc, l, mid, x);
else return ask(t[p].rc, mid + 1, r, x);
}
int main() {
cin >> n >> m;
root[0] = build(1, n);
//cout << root[0];
for (register int i = 1; i <= m; ++i) {
int v, op, x, y;
scanf("%d%d%d", &v, &op, &x);
if (op == 1) {
scanf("%d", &y);
root[i] = insert(root[v], 1, n, x, y);
} if (op == 2) {
root[i] = root[v];
printf("%d\n", ask(root[v], 1, n, x));
}
}
}