#E. 【模板】可持久化线段树 1(可持久化数组)

    Type: RemoteJudge 1500ms 1024MiB

【模板】可持久化线段树 1(可持久化数组)

You cannot submit for this problem because the contest is ended. You can click "Open in Problem Set" to view this problem in normal mode.

题目背景

UPDATE : 最后一个点时间空间已经放大

2021.9.18 增添一组 hack 数据 by @panyf

标题即题意

有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集)

题目描述

如题,你需要维护这样的一个长度为 N N 的数组,支持如下几种操作

  1. 在某个历史版本上修改某一个位置上的值

  2. 访问某个历史版本上的某一位置的值

此外,每进行一次操作(对于操作2,即为生成一个完全一样的版本,不作任何改动),就会生成一个新的版本。版本编号即为当前操作的编号(从1开始编号,版本0表示初始状态数组)

输入格式

输入的第一行包含两个正整数 N,M N, M , 分别表示数组的长度和操作的个数。

第二行包含N N 个整数,依次为初始状态下数组各位的值(依次为 ai a_i 1iN 1 \leq i \leq N )。

接下来M M 行每行包含3或4个整数,代表两种操作之一(i i 为基于的历史版本号):

  1. 对于操作1,格式为vi 1 loci valuei v_i \ 1 \ {loc}_i \ {value}_i ,即为在版本vi v_i 的基础上,将 aloci a_{{loc}_i} 修改为 valuei {value}_i

  2. 对于操作2,格式为vi 2 loci v_i \ 2 \ {loc}_i ,即访问版本vi v_i 中的 aloci a_{{loc}_i} 的值,注意:生成一样版本的对象应为 viv_i

输出格式

输出包含若干行,依次为每个操作2的结果。

5 10
59 46 14 87 41
0 2 1
0 1 1 14
0 1 1 57
0 1 1 88
4 2 4
0 2 5
0 2 4
4 2 1
2 2 2
1 1 5 91
59
87
41
87
88
46

提示

数据规模:

对于30%的数据:1N,M103 1 \leq N, M \leq {10}^3

对于50%的数据:1N,M104 1 \leq N, M \leq {10}^4

对于70%的数据:1N,M105 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$

经测试,正常常数的可持久化数组可以通过,请各位放心

数据略微凶残,请注意常数不要过大

另,此题I/O量较大,如果实在TLE请注意I/O优化

询问生成的版本是指你访问的那个版本的复制

样例说明:

一共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

初二竞赛组——主席树&线段树合并

Not Claimed
Status
Done
Problem
5
Open Since
2025-3-4 8:00
Deadline
2025-4-2 23:59
Extension
24 hour(s)