可持久化数组

include

include

include

include

include

using namespace std;

int tot, n, m;
int a[5211314], root[5211314];
int loc, v, op, value;

struct Segment_Tree {
int lson, rson;
int val;
}tree[52113140];

struct Persistent_Segment_Tree {
#define lid tree[id].lson
#define rid tree[id].rson
int Make(int id) {
tot ++;
tree[tot] = tree[id];
return tot;
}
void BuildTree(int &id, int l, int r) {
tot ++, id = tot;
if (l == r) {
tree[id].val = a[l];
return;
}
int mid = (l + r) >> 1;
BuildTree(lid, l, mid);
BuildTree(rid, mid + 1, r);
return;
}
int Update(int id, int l, int r, int pos, int num) {
id = Make(id);
if (l == r) {
tree[id].val = num;
return id;
}
int mid = (l + r) >> 1;
if (pos <= mid) lid = Update(lid, l, mid, pos, num);
else rid = Update(rid, mid + 1, r, pos, num);
return id;
}
int Query(int id, int l, int r, int pos) {
if (l == r) {
return tree[id].val;
}
int mid = (l + r) >> 1;
if (pos <= mid) return Query(lid, l, mid, pos);
else return Query(rid, mid + 1, r, pos);
}
}Tree;

int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++ i) {
scanf("%d", &a[i]);
}
Tree.BuildTree(root[0], 1, n);
for (int i = 1; i <= m; ++ i) {
scanf("%d%d%d", &v, &op, &loc);
if (op == 1) {
scanf("%d", &value);
root[i] = Tree.Update(root[v], 1, n, loc, value);
//注意奥,这里update不能传指,因为会更新root[v]
}
else {
printf("%d\n", Tree.Query(root[v], 1, n, loc));
root[i] = root[v];
}
}
return 0;
}

posted @ 2023-07-29 07:57  觉清风  阅读(12)  评论(1编辑  收藏  举报