rt,下面这份代码不注释#define int long long就会报错,不知道为什么
/*Code By Manipula*/
#include <bits/stdc++.h>
// #pragma GCC optimize(2)
#define INF 0x3f3f3f3f
// #define int long long
#define swap(x, y) x ^= y ^= x ^= y
#define sqrt(n) pow(n, 0.5)
#define sort stable_sort
#define mk(x, y) make_pair(x, y)
#define mt(arr, num) memset(arr, num, sizeof(arr))
#define endl '\n'
using namespace std;
const int N = 1e6 + 5;
struct SegmentTree{
int l, r, ls, rs, val;
}tr[N << 6];
int rt[N], val[N], n, T, tot;
int build(int p, int l, int r)
{
p = ++tot;
tr[p].l = l; tr[p].r = r;
if (l == r){tr[p].val = val[l]; return p;}
int mid = (l + r) >> 1;
tr[p].ls = build(tr[p].ls, l, mid);
tr[p].rs = build(tr[p].rs, mid + 1, r);
return p;
}
int copy(int p){tr[++tot] = tr[p]; return tot;}
int update(int p, int x, int k)
{
p = copy(p);
if (tr[p].l == tr[p].r){tr[p].val = k; return p;}
int mid = (tr[p].l + tr[p].r) >> 1;
if (x <= mid)tr[p].ls = update(tr[p].ls, x, k);
else tr[p].rs = update(tr[p].rs, x, k);
return p;
}
int query(int p, int x)
{
if (tr[p].l == tr[p].r)return tr[p].val;
int mid = (tr[p].l + tr[p].r) >> 1;
if (x <= mid)return query(tr[p].ls, x);
else return query(tr[p].rs, x);
}
signed main()
{
scanf("%d%d", &n, &T);
rt[0] = 1;
for (int i = 1; i <= n; i++)scanf("%d", &val[i]);
build(1, 1, n);
for (int i = 1; i <= T; i++)
{
int v, opt, x, k;
scanf("%d%d%d", &v, &opt, &x);
if (opt == 1)
{
scanf("%d", &k);
rt[i] = update(rt[v], x, k);
}
else
{
printf("%d\n", query(rt[v], x));
rt[i] = rt[v];
}
}
return 0;
}