P3919 【模板】可持久化线段树 1(可持久化数组)
题目背景
**UPDATE : 最后一个点时间空间已经放大。**
2021.9.18 增添一组 hack 数据 by @panyf。
标题即题意。
有了可持久化数组,便可以实现很多衍生的可持久化功能。(例如:可持久化并查集)
题目描述
如题,你需要维护这样的一个长度为 $ N $ 的数组,支持如下两种操作:
1. 在某个历史版本上修改某一个位置上的值。
2. 访问某个历史版本上的某一位置的值。
此外,每进行一次操作,就会生成一个新的版本。版本编号即为当前操作的编号(从 $1$ 开始编号,版本 $0$ 表示初始状态数组)。
**对于操作 $2$,即为生成一个完全一样的版本,不作任何改动**。即,询问生成的版本是询问所访问的那个版本的复制。
输入格式
输入的第一行包含两个正整数 $ N, M $,分别表示数组的长度和操作的个数。
第二行包含 $ N $ 个整数,依次为初始状态下数组各位的值(依次为 $ a_i $,$ 1 \leq i \leq N $)。
接下来 $ M $ 行每行包含 $3$ 或 $4$ 个整数,代表两种操作之一(设当前是第 $i$ 次操作):
1. 对于操作 $1$,格式为 `v 1 p c`,即为在版本 $ v $ 的基础上,将 $ a_{p} $ 修改为 $c$。
2. 对于操作 $2$,格式为 `v 2 p`,即访问版本 $ v $ 中的 $ a_{p} $ 的值,注意:**生成一样版本的对象应为 $v$**。
输出格式
输出包含若干行,依次为每个操作 $2$ 的结果。
说明/提示
### 数据规模
对于 $30\%$ 的数据,$ 1 \leq N, M \leq {10}^3 $。
对于 $50\%$ 的数据,$ 1 \leq N, M \leq {10}^4 $。
对于 $70\%$ 的数据,$ 1 \leq N, M \leq {10}^5 $。
对于 $100\%$ 的数据:
- $ 1 \leq N, M \leq {10}^6$;
- $1 \leq p \leq N$;
- 设当前是第 $x$ 次操作,$0 \leq v < x$;
- $-{10}^9 \leq a_i,c \leq {10}^9$。
### 样例说明
所有操作结束后,总共生成了 $11$ 个版本,编号为 $0 \sim 10$,依次为:
版本 $0$:`59 46 14 87 41`,
版本 $1$:`59 46 14 87 41`,
版本 $2$:`14 46 14 87 41`,
版本 $3$:`57 46 14 87 41`,
版本 $4$:`88 46 14 87 41`,
版本 $5$:`88 46 14 87 41`,
版本 $6$:`59 46 14 87 41`,
版本 $7$:`59 46 14 87 41`,
版本 $8$:`88 46 14 87 41`,
版本 $9$:`14 46 14 87 41`,
版本 $10$:`59 46 14 87 91`。