给出序列 A, 要求支持:
- 询问 Al 到 Ar 中最大的数
- 删除 Ax, 并且 x+1 以后的元素整体前移
- 在末尾增加一个数。
这是我们学校线段树讲义上的题。我知道怎么做了。但是想找一个 OJ 提交,找不到。
这是一些线索(也就是讲义上给的题解):
-
用 Splay 也是可以的我并没有意见
-
用线段树记录每个位置的数是否存在, 存在则标为 1, 不存在则
标为 0
-
当然相应的 l,r 也要修改
-
转成线段树中第 k 小的数是哪个, 在线段树上二分
if (k <= sum[o]) Query(o << 1, l, mid);
else k -= sum[o], Query(o << 1 | 1, mid + 1, r);