题目背景
这是一道模板题。
题目描述
您需要写一种数据结构,来维护一个序列,其中需要提供以下操作(对于各个以往的历史版本):
- 在第 pp 个数后插入数 xx 。
- 删除第 pp 个数。
- 翻转区间 [l,r][l,r],例如原序列是 \{5,4,3,2,1\}{5,4,3,2,1},翻转区间 [2,4][2,4] 后,结果是 \{5,2,3,4,1\}{5,2,3,4,1}。
- 查询区间 [l,r][l,r] 中所有数的和。
和原本平衡树不同的一点是,每一次的任何操作都是基于某一个历史版本,同时生成一个新的版本(操作 44即保持原版本无变化),新版本即编号为此次操作的序号。
本题强制在线。
输入格式
第一行包含一个正整数 NN,表示操作的总数。
接下来 NN 行,每行前两个整数 v_i,opt_ivi,opti,v_ivi 表示基于的过去版本号 (0\le v_i<i)(0≤vi<i),opt_iopti 表示操作的序号 (1\le opt_i\le 4)(1≤opti≤4)。
若 opt_i=1opti=1,则接下来两个整数 p_i,x_ipi,xi,表示操作为在第 p_ipi 个数后插入数 xx 。
若 opt_i=2opti=2,则接下来一个整数 p_ipi,表示操作为删除第 p_ipi 个数。
若 opt_i=3opti=3,则接下来两个整数 l_i,r_ili,ri,表示操作为翻转区间 [l_i,r_i][li,ri]。
若 opt_i=4opt