#3837. 兔猫信奥学院的“时空快照阵列”
兔猫信奥学院的“时空快照阵列”
🏫 题目名称:兔猫信奥学院的“时空快照阵列”
🐰🐱 题目描述
在兔猫信奥学院的魔法实验室里,加菲老师准备了一块神奇的“时空阵列”——它能够记录多次状态快照,让小兔和小猫穿梭于不同时间点,读取数组的历史值。
这个阵列有固定长度 n
,初始化时每个位置都存放 0。它支持三种操作:
- SET
index val
:将当前时刻数组的下标index
处赋值为val
。 - SNAP:制作一次快照,返回当前快照编号
snap_id
(编号从 0 开始)。 - GET
index snap_id
:读取编号为snap_id
的快照中,数组下标index
处的数值,并返回它。
加菲老师说:“所有操作一共不会超过 5×10⁴ 次,长度也不会超过 5×10⁴。请你用 O((n+Q)·log Q) 或更优的算法来支持这三种操作!”
📥 输入格式
第一行:两个整数 n, Q
接下来 Q 行,每行表示一次操作:
• “1 index val” —— 对应 SET(index, val)
• “2” —— 对应 snap(),需要输出 snap_id
• “3 index id” —— 对应 get(index, id),需要输出查询结果
- 1 ≤ n ≤ 50000
- 1 ≤ Q ≤ 50000
- 对于 SET/GET:0 ≤ index < n
- 0 ≤ val ≤ 10^9
- 对于 GET:0 ≤ id < 当前已执行的 SNAP 次数
📤 输出格式
对每一次 SNAP 操作,输出一行快照编号 snap_id
;
对每一次 GET 操作,输出一行查询结果数值。
SET 操作不产生输出。
💡 输入输出样例
样例 1
3 5
1 0 5
2
1 0 6
3 0 0
3 0 1
0
5
6
- 操作 1:SET(0,5)
- 操作 2:SNAP → 返回 0
- 操作 3:SET(0,6)
- 操作 4:GET(0,0) → 快照 0 时,array[0]=5
- 操作 5:GET(0,1) → 快照 1 时(第 2 次 SNAP,从 0 开始编号),array[0]=6
样例 2
2 4
2
3 1 0
2
3 1 1
0
0
1
0
- 初始时所有元素为 0
- 第一次 SNAP → 返回 0
- GET(1,0) → 0
- 第二次 SNAP → 返回 1
- GET(1,1) → 0
📊 数据范围
- 数组长度
n
、操作次数Q
均不超过 50000 - 所有操作合计 ≤ 50000
- 要求平均时间复杂度 ≲ O((n+Q)·log Q)