题目大意
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
$1$. 插入$x$数
$2$. 删除$x$数(若有多个相同的数,因只删除一个)
$3$. 查询$x$数的排名(若有多个相同的数,因输出最小的排名)
$4$. 查询排名为$x$的数
$5$. 求$x$的前驱(前驱定义为小于$x$,且最大的数)
$6$. 求$x$的后继(后继定义为大于$x$,且最小的数)
最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分。
超级计算机中的任务用三元组$(S_i,E_i,P_i)$描述,$(S_i,E_i,P_i)$表示任务从第$S_i$秒开始,在第$E_i$秒后结束(第$S_i$秒和$E_i$秒任务也在运行),其优先级为$P_i$。同一时间可能有多个任务同时执行,它们的优先级可能相同,也可能不同。
调度系统会经常向查询系统询问,第$X_i$秒正在运行的任务中,优先级最小的$K_i$个任务(即将任务按照优先级从小到大排序后取前$K_i$个)的优先级之和是多少。特别的,如果$K_i$大于第$X_i$秒正在运行的任务总数,则直接回答第$X_i$秒正在运行的任务优先级之和。上述所有参数均为整数,时间的范围在$1$到$n$之间(包含$1$和$n$)。
有一个序列,初始状态有$n$个数,$m$次操作,有以下几种操作:
1.在第$x$个数后面插入一个值为$t$的数;
2.把第$x$个数删掉;
3.查询第$l$个数到第$r$个数的最大值;
4.回到第$k$个操作后的状态(如果$k=0$表示回到初始状态)。
为了防止用离线做法水过,当然就要强制在线。
设当前序列有$N$个数,当前是第$M$次操作,上次答案是$lastans$,一开始$lastans=0$,加密规则如下:
1.输入$xx$,$tt$,则$x=(xx+lastans)\%(N+1),t=tt^lastans$。
2.输入$xx$,则$x=(xx+lastans)\%N+1$。
3.输入$ll,rr$,则$l=(ll+lastans)\%N+1,r=(rr+lastans*2)\%N+1$,如果$l\gt r$就交换一下。
4.输入$kk$,则$k=(kk+lastans)\%M$。