题目大意
现要求维护一个序列(初始为空),要求实现m个操作,包括以下几种。
- 在序列末尾添加一个数
x - 删除数列末尾的x个数
- 询问
[l,r) 区间中所有数与x异或,取得最大值的数 - 查询
[l,r) 区间中的第x小数 - 查询
[l,r) 区间中,小于等于x的数的个数
m≤5×105,序列中的数≤5×105
分析
找区间第k小,小于等于某个数的个数,以及异或最值,可以分别用可持久化线段树以及可持久化
那么这道题就基本上解决了。
我们维护一个栈,表示当前的序列。
对于操作1,添加一个数,则在当前序列末尾的数据结构基础上修改,将这个数压入栈中,并将新建的这个修改后的数据结构指向新加入的数。
对于操作
对于操作
时间复杂度O(mlogn)
空间复杂度O(mlogn)