
主席树板子
刚学完可持久化,趁热打铁
#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define fr first
#define se second
typedef pair<int, int> PII;
typedef unsigned long long ULL;
const int INF = 0X3f3f3f3f, N = 1e6 + 10, MOD = 1e9 + 10;
int a[N];
int root[N], idx;
struct NODE {
int l, r;
int val;
} tr[4 * N + 4 * 20 * N];
int build(int l, int r) {
int q = ++idx;
if (l == r) {
tr[q].val = a[l];
return q;
} else {
int mid = l + r >> 1;
tr[q].l = build(l, mid);
tr[q].r = build(mid + 1, r);
return q;
}
}
int insert(int p, int l, int r, int pos, int x) {
int q = ++idx;
tr[q] = tr[p];
if (l == r) {
if (x != INF) tr[q].val = x;
return q;
} else {
int mid = l + r >> 1;
if (pos <= mid) tr[q].l = insert(tr[p].l, l, mid, pos, x);
else tr[q].r = insert(tr[p].r, mid + 1, r, pos, x);
return q;
}
}
int query(int q, int l, int r, int pos) {
if (l == r) return tr[q].val;
else {
int mid = l + r >> 1;
if (pos <= mid) return query(tr[q].l, l, mid, pos);
else return query(tr[q].r, mid + 1, r, pos);
}
}
void work() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
root[0] = build(1, n);
int v, op, pos, x;
for (int i = 1; i <= m; i++) {
scanf("%d%d%d", &v, &op, &pos);
if (op == 1) {
scanf("%d", &x);
root[i] = insert(root[v], 1, n, pos, x);
} else {
printf("%d\n", query(root[v], 1, n, pos));
root[i] = insert(root[v], 1, n, pos, INF);
}
}
}
int main() {
work();
return 0;
}