题目背景
这是一道模板题。
题目描述
您需要写一种数据结构,来维护一个序列,其中需要提供以下操作(对于各个以往的历史版本):
- 在第 p 个数后插入数 x。
- 删除第 p 个数。
- 翻转区间 [l,r],例如原序列是 {5,4,3,2,1},翻转区间 [2,4] 后,结果是 {5,2,3,4,1}。
- 查询区间 [l,r] 中所有数的和。
和原本平衡树不同的一点是,每一次的任何操作都是基于某一个历史版本,同时生成一个新的版本(操作 4 即保持原版本无变化),新版本即编号为此次操作的序号。
本题强制在线。
输入格式
第一行包含一个整数 n,表示操作的总数。
接下来 n 行,每行前两个整数 vi,opti,vi 表示基于的过去版本号(0≤vi<i),opti 表示操作的序号(1≤opti≤4)。
若 opti=1,则接下来两个整数 pi,xi,表示操作为在第 pi 个数后插入数 x 。
若 opti=2,则接下来一个整数 pi,表示操作为删除第 pi 个数。
若 opti=3,则接下来两个整数 li,ri,表示操作为翻转区间 [li,ri]。
若 opti=4,则接下来两个整数 li,ri,表示操作为查询区间 [li,ri] 的和。
强制在线规则:
令当前操作之前的最后一次 4 操作的答案为 lastans(如果之前没有 4 操作,则 lastans=0)。
则此次操作的 pi,xi 或 li,ri 均按位异或上 lastans 即可得到真实的 pi,xi 或 li,ri。
输出格式
对于每个序号为 4 的查询操作,输出一行一个数表示区间的和。
10
0 1 0 1
1 1 1 2
2 4 1 2
3 1 2 0
4 4 2 1
5 3 5 7
6 4 5 6
4 1 7 1
8 3 4 6
9 4 4 1
3
4
5
10
提示
强制在线:以下针对 pi,xi,li,ri 的限制均是按位异或 lastans 后的限制。
- 对于 6 个测试点,n≤5000。
- 对于另外 6 个测试点,vi=i−1。
- 欢迎用户加强数据,可联系管理员或出题人。
对于 100% 的数据,1≤n≤2×105,∣xi∣<106。
假设基于的历史版本的序列长度为 len≥1,有:
若 opti=1,则 0≤pi≤len。
若 opti=2,则 1≤pi≤len。
若 opti=3,则 1≤li≤ri≤len。
若 opti=4,则 1≤li≤ri≤len。
假设基于的历史版本的序列长度为 0,有:
opti=1,pi=0。