5994 - NOI:树套树:模板(线段树+平衡树)

通过次数

3

提交次数

6

时间限制 : 2 秒
内存限制 : 512 MB

您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:

  1. 查询 k 在区间内的排名;
  2. 查询区间内排名为 k 的值;
  3. 修改某一位置上的数值;
  4. 查询 k 在区间内的前驱(前驱定义为严格小于 x,且最大的数,若不存在输出 -2147483647);
  5. 查询 k 在区间内的后继(后继定义为严格大于 x,且最小的数,若不存在输出 2147483647)。

对于一组元素,一个数的排名被定义为严格比它小的元素个数加一,而排名为 k 的数被定义为“将元素从小到大排序后排在第 k 位的元素值”。

输入

第一行两个数 n,m,表示长度为 n 的有序序列和 m 个操作。

第二行有 n 个数,表示有序序列。

下面有 m 行,opt 表示操作标号。

opt=1,则为操作 1,之后有三个数 l~r~k,表示查询 k 在区间 [l,r] 的排名。

opt=2,则为操作 2,之后有三个数 l~r~k,表示查询区间 [l,r] 内排名为 k 的数。

opt=3,则为操作 3,之后有两个数 pos~k,表示将 pos 位置的数修改为 k

opt=4,则为操作 4,之后有三个数 l~r~k,表示查询区间 [l,r]k 的前驱。

opt=5,则为操作 5,之后有三个数 l~r~k,表示查询区间 [l,r]k 的后继。

输出

对于操作 1,2,4,5,各输出一行,表示查询结果。

样例

输入

9 6
4 2 2 1 9 4 0 1 1
2 1 4 3
3 4 10
2 1 4 3
1 2 5 9
4 3 9 5
5 2 8 5

输出

2
4
3
4
9

提示

1\le n,m\le5\times 10^4,序列中的值在任何时刻 \in[0,10^8]