P4278 带插入区间K小值
题目背景
**本题时限已经修改为 $\text{2s}$**。
**请使用常数较小的写法或者比较好的科技去过本题**。
题目描述
从前有 $n$ 只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力 $a_i$ 。跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴。这时跳蚤国王决定理性愉悦一下,查询区间 $k$ 小值。他每次向它的随从伏特提出这样的问题:从左往右第 $x$ 个到第 $y$ 个跳蚤中,$a_i$ 第 $k$ 小的值是多少。
这可难不倒伏特,他在脑袋里使用函数式线段树前缀和的方法水掉了跳蚤国王的询问。
这时伏特发现有些跳蚤跳久了弹跳力会有变化,有的会增大,有的会减少。
这可难不倒伏特,他在脑袋里使用树状数组套线段树的方法水掉了跳蚤国王的询问。(orz 主席树)
这时伏特发现有些迟到的跳蚤会插入到这一行的某个位置上,他感到非常生气,因为……他不会做了。
请你帮一帮伏特吧。
**快捷版题意:带插入、修改的区间第 $k$ 小值在线查询**。
输入格式
第一行一个正整数 $n$ ,表示原来有 $n$ 只跳蚤排成一行做早操。
第二行有 $n$ 个用空格隔开的非负整数,从左至右代表每只跳蚤的弹跳力。
第三行一个正整数 $q$,表示下面有多少个操作。
下面一共 $q$ 行,一共三种操作对原序列的操作:(假设此时一共 $m$ 只跳蚤)
1. `Q x y k`: 询问从左至右第 $x$ 只跳蚤到从左至右第 $y$ 只跳蚤中,弹跳力第 $k$ 小的跳蚤的弹跳力是多少。($1 \le x \le y \le m, 1 \le k \le y - x + 1$)
2. `M x val`: 将从左至右第 $x$ 只跳蚤的弹跳力改为 $\textit{val}$。($1 \le x \le m$)
3. `I x val`: 在从左至右第 $x$ 只跳蚤的前面插入一只弹跳力为 $\textit{val}$ 的跳蚤。即插入后从左至右第 $x$ 只跳蚤是我刚插入的跳蚤。($1 \le x \le m + 1$)
为了体现在线操作,设 $\textit{lastans}$ 为上一次查询的时候程序输出的结果,如果之前没有查询过,则 $\textit{lastans} = 0$。
则输入的时候实际是:
- `Q _x _y _k`:表示 `Q _x^lastans _y^lastans _k^lastAns`
- `M _x _val`:表示 `M _x^lastans _val^lastans`
- `I _x _val`:表示 `I _x^lastans _val^lastans`
简单来说就是操作中输入的整数都要异或上一次询问的结果进行解码。
(祝 `Pascal` 的同学早日转 `C++`,就不提供 `Pascal` 版的描述了。)
输出格式
对于每个询问输出回答,每行一个回答。
说明/提示
$n \le 35000$;
插入个数 $\le 35000$,修改个数 $\le 70000$,查询个数 $\le 70000$ ,$0 \le$ 每时每刻的权值 $\le 70000$。
数据无梯度。