loj#P6203. 可持久化队列

可持久化队列

题目描述

PID: 53666110

这是一道假的模板题

我们有一个数组 AA,初始时只有 A[0]A[0] 是空序列。对于第 ii 个操作:

  • 1 ver t 表示将 A[ver]A[ver] 复制A[i]A[i],并在 A[ver]A[ver] 结尾插入元素 tt
  • 2 ver 表示将 A[ver]A[ver] 复制A[i]A[i],并删除 A[ver]A[ver] 开头的元素(保证 A[i]A[i] 非空)

此外,你需要维护一个变量 hashhash,其初始值为 00,每次执行完第二类操作时,将 hashhash 变为 (31×hash+x)mod232(31 \times hash + x) \bmod 2^{32},其中 xx 是被删除的元素。

hashhash 是你的最终输出的答案。

此外,输入数据有可能加密,取决于输入参数 tyty 的值。如果 ty=0ty = 0,那么数据没有加密;否则,ty=1ty=1,那么读入 ververtt 的值,其真实值应与当前的 hashhash 取按位异或,也就是说真实值应为 verhashver \oplus hash 和(对于第一类操作) thasht \oplus hash

输入格式

第一行有两个整数,TTtyty,表示有多少个操作,和数据是否加密。

之后的 TT 行,每一行表示一个如上所述的操作。

输出格式

只有一行,表示执行完所有操作之后,hashhash 的值。

9 0
1 0 1
1 1 2
2 1
2 2
2 2
2 4
1 4 5
2 7
2 8

29584452

9 1
1 0 1
1 1 2
2 1
2 3
2 34
2 997
1 30789 30788
2 30790
2 954345

29584452

数据范围与提示

测试点编号 T ty
1 10310^3 1
2, 3, 4 10510^5
5, 6 10610^6 0
7, 8, 9, 10 1

对于所有操作,保证操作合法,即格式正确,不会在空的版本上进行操作 22ver0ver \geq 0verver 小于当前操作编号。

对于第一类操作,0t<100000000 \leq t \lt 10000000


请使用无符号整数进行输入输出!变量应使用 unsigned 类型,printfscanf 应使用 %u 格式。

如果你使用冲击满分的算法,但是使用 scanf,你的程序很可能将花费超过 80%80\% 的运行时间在输入数据。所以请务必使用读入优化!可以参考附加文件中 bqsg 提供的 read.cpp 实现的 A + B Problem 的程序。