调吐了……
题目描述
太长了,所以就不写了,直接贴链接Picks loves segment tree IX
题解
首先考虑没有 + + +操作时怎么做,没有 + + +操作后每个位相对独立,可以设 p r e i , j pre_{i,j} prei,j表示前 j j j个操作中,对第 i i i位具有赋值效果的最大的操作编号,利用这个就可以规避掉 & ∣ \&| &∣操作,然后直接算区间异或和即可, O ( n log v ) O(n\log v) O(nlogv)预处理, O ( 1 ) O(1) O(1)回答询问
对于 + + +操作,一个显然的想法就是把 + + +转化成 xor \text{xor} xor操作来处理,但是进位很不好搞,第 i i i位 + 1 +1 +1后进位,当且仅当 + + +了之后 0 ∼ i − 1 0\sim i-1 0∼i−1位上都是 0 0 0
通过这个性质把进位的操作都给找出来,想办法把初始操作的 v v v低位连续 0 0 0的个数不断增加
设 g i , j g_{i,j} gi,j表示一开始时 v v v的 0 ∼ i − 1 0\sim i-1 0∼i−1位都是 0 0 0,从 j j j操作开始到 g i , j g_{i,j} gi,j操作, v v v的 0 ∼ i 0\sim i 0∼i位第一次都变为 0 0 0,没有设为 i n f inf inf
我们可以通过这个东西不断地操作使得 v v v的低位连续 0 0 0增加
当 0 ∼ t − 1 0\sim t-1 0∼t−1位都是 0 0 0以后,我们再设 f i , j f_{i,j} fi,j表示一开始时 v v v的 0 ∼ i 0\sim i 0∼i位都是 0 0 0,从 j j j操作开始到 f i , j f_{i,j} fi,j操作, v v v的 0 ∼ i 0\sim i 0∼i位第一次都变为 0 0 0,没有设为 i n f inf inf,可以通过这个东西再不断地向后移动
f , g f,g f,g可以互推, f 0 , g 0 f_0,g_0 f0,