3408 - 线段树分裂

通过次数

1

提交次数

4

时间限制 : 1 秒
内存限制 : 128 MB

给出一个可重集 a(编号为 1),它支持以下操作:

0 p x y:将可重集 p 中大于等于 x 且小于等于 y 的值移动到一个新的可重集中(新可重集编号为从 2 开始的正整数,是上一次产生的新可重集的编号+1)。

1 p t:将可重集 t 中的数放入可重集 p,且清空可重集 t(数据保证在此后的操作中不会出现可重集 t)。

2 p x q:在 p 这个可重集中加入 x 个数字 q

3 p x y:查询可重集 p 中大于等于 x 且小于等于 y 的值的个数。

4 p k:查询在 p 这个可重集中第 k 小的数,不存在时输出 -1

输入

第一行两个整数 n,m,表示可重集中的数在 1\sim n 的范围内,有 m 个操作。

接下来一行 n 个整数,表示 1 \sim n 这些数在 a 中出现的次数 (a_{i} \leq m)

接下来的 m 行每行若干个整数,第一个数为操作的编号 opt0 \leq opt \leq 4),以题目描述为准。

输出

依次输出每个查询操作的答案。

样例

输入

5 12
0 0 0 0 0
2 1 1 1
2 1 1 2
2 1 1 3
3 1 1 3
4 1 2
2 1 1 4
2 1 1 5
0 1 2 4
2 2 1 4
3 2 2 4
1 1 2
4 1 3

输出

3
2
4
3

提示

对于 100\% 的数据,1 \le n \le 2 \times {10}^51 \le x, y, q \le m \le 2 \times {10}^5。保证数据合法。

来源

模板