Problem
Dynamic Rankings
Description
给定一个含有个数的序列。
对于给定的,请回答在中第小的数是多少。
在询问中会有操作改变一些的值,改变后,需要针对改变后的继续回答上面的问题。
Input
第一行有两个正整数。
分别表示序列的长度和指令的个数。
第二行有个数,表示,这些数都小于。
接下来的行描述每条指令,每行的格式是下面两种格式中的一种。
- 表示询问指令,询问中第小的数。
- 表示把改变成为。
Output
对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。
Sample Input
1 | 5 3 |
Sample Output
1 | 3 |
HINT
标签:整体二分
Solution
整体二分经典题,直接上整体二分即可。
考虑将所有询问离线下来,对所有询问同时进行二分答案,二分函数有四个参数,表示答案在区间内的询问为在询问序列上位置在之间的所有询问。
如果,则可知询问序列上位置在间的所有询问答案均为。否则,我们需要把间的所有询问分为前后两部分,前一部分为答案在间的所有询问,后一部分为答案在间的所有询问。这个过程用一棵树状数组判断一下间每个询问的答案在哪边即可。
然而我们还需要维护修改操作。对于修改操作,我们同样将其加入整体二分。当询问函数将答案限制到时,只有参数在间的修改操作才会对这个间的询问答案产生影响。于是将每个修改拆成两个操作,即在某位置上删除一个数和加入一个数。
用树状数组维护时,若删除或加入的数在间,在树状数组上对应位置或。对于询问,若询问区间为,那么该询问的值为树状数组上位置上的值之和。这样一来,统计的是每个询问区间内小于等于的数的个数,若,则答案一定在间;否则,答案一定大于。分治处理即可。
由于整体二分会带来一个,枚举每个询问并用树状数组判断其答案在左边还是右边需要,故总复杂度为。
Code
1 |
|