我对主席树的理解再次升华了
不难看出对于每次2操作,答案最大是n+1(因为每次更新是+10000000, 永远不会占用n+1,而且k是保证<=n的). 如果某个数字被进行过1操作, 那么就代表这个数字可以用于2类操作的查询,把这个数字加到set里.对于找2类询问的答案,第一种是从a[r+1,n]里找>=k的最小值(主席树实现),第二种是从这个set里找>=k的最小值(对set进行二分查找),取两者间最小值即可.
更新:
举个例子 :n=6,a={6 2 4 3 5 1}
操作依次为 (1,3) (2,4,4) (1,5) (1,1,5)以上值均是异或lastans后的值
对于(1,3), 把4放到了set,这意味着无论以后2类操作的r是多少,4都有可能成为答案. 然后对于(2,4,4), 我们去查(5,6)中的大于等于4的最小值,查出来是5,再查set里的大于等于4的最小值,查出来是4,所以答案是4.
对于(1,5),把5放到set里,对于(1,1,5),我们查询{2,4,3,5,1}中大于等于5的最小值,和set{4,5}中的大于等于5的最小值,这就是为什么我们不需要把5加上10000000,因为5一定存到set里了,如果答案是5,主席树的查询和set的查询肯定都会是5, 如果答案不是5,那5更不会有什么影响了
#include
#include
#include
#include
#include
#include
#include
#include
#include