分块.
$\mbox{xor}$ 显然就只是一个系数,用不上什么特殊性质.
考虑对序列分块,每个元素维护 $f(i)$ 表示从该块的 $l$ 到 $i$ 的前缀 $\gcd$ , $g(i)$ 表示从该块的 $l$ 到 $i$ 的前缀 $\mbox{xor}$ .
查询时依次处理每个块,记前面所有块的前缀 $\gcd$ 为 $pregcd$ ,前缀 $\mbox{xor}$ 为 $prexor$ .
前缀 $\gcd$ 是单调不升的,若加上这一块后, $pregcd$ 不变,则说明这一块的所有前缀 $gcd$ 都是 $pregcd$ .
此时只需要找一下这块内的第一个 $g(i) = \frac x {pregcd}\mbox{ xor } prexor$ ,这可以用 $map$ 预处理出来.
如果加上这一块后, $pregcd$ 会改变,就暴力枚举这个块内的每个位置,判断是否有解.
每次 $pregcd$ 减小时,都会至少减小到原来的一半,所以暴力枚举的位置最多 $O(\log a)$ 个.
修改时直接暴力重构所在的那一块即可.
时间复杂度 $O(m\cdot \sqrt n\cdot \log a)$ .
1 |
|