可持久化数组
题目描述
如题,你需要维护这样的一个长度为 $N$ 的数组,支持如下几种操作
在某个历史版本上修改某一个位置上的值
访问某个历史版本上的某一位置的值
此外,每进行一次操作(对于操作2,即为生成一个完全一样的版本,不作任何改动),就会生成一个新的版本。版本编号即为当前操作的编号(从1开始编号,版本0表示初始状态数组)
输入格式
输入的第一行包含两个正整数$N,M$,分别表示数组的长度和操作的个数。
第二行包含$N$个整数,依次为初始状态下数组各位的值(依次为$a_i$,$1 \leq i \leq N$)。
接下来$M$行每行包含3或4个整数,代表两种操作之一($i$为基于的历史版本号)
输出格式
输出包含若干行,依次为每个操作2的结果。
样例 #1
样例输入 #1
1 | 5 10 |
样例输出 #1
1 | 59 |
提示
数据规模:
对于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 {loc}_i \leq N, 0 \leq v_i < i, -{10}^9 \leq a_i, {value}_i \leq {10}^9$
询问生成的版本是指你访问的那个版本的复制
样例说明:
一共11个版本,编号从0-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
AC Code
1 |
|
伪代码
1 | idx:节点编号 |