CF1004F Sonya and Bitwise OR
题目描述
Sonya 有一个由 $n$ 个整数构成的数组 $a_1, a_2, \ldots, a_n$,以及一个非负整数 $x$。她需要执行 $m$ 次两种类型的操作:
- $1\ i\ y$:将第 $i$ 个元素替换为 $y$,即执行 $a_i := y$;
- $2\ l\ r$:在区间 $[l, r]$ 上,统计有多少对 $(L, R)$ 满足 $l \leq L \leq R \leq r$,并且区间 $[L, R]$ 内所有整数的按位或(bitwise OR)结果不少于 $x$(注意,$x$ 对所有查询都是固定的)。
你能帮助 Sonya 完成所有查询吗?
按位或(bitwise OR)是两个非负整数上的二元运算。计算两个数的按位或时,需要将它们都写成二进制表示。结果是在每一位上,只要两个数中有一个该位为 $1$,结果的该位就为 $1$。例如,$10$ OR $19 = 1010_2$ OR $10011_2 = 11011_2 = 27$。
输入格式
第一行包含三个整数 $n$、$m$ 和 $x$($1 \leq n, m \leq 10^5$,$0 \leq x < 2^{20}$)——数组的长度、操作次数和所有查询的常数 $x$。
第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$($0 \leq a_i < 2^{20}$)——数组的初始值。
接下来的 $m$ 行,每行描述一个操作,格式如下:
- $1\ i\ y$($1 \leq i \leq n$,$0 \leq y < 2^{20}$),表示将 $a_i$ 替换为 $y$;
- $2\ l\ r$($1 \leq l \leq r \leq n$),表示询问区间 $[l, r]$ 内有多少个子区间,其所有元素的按位或结果不少于 $x$。
输出格式
对于每个类型为 2 的查询,输出一个整数,表示区间内所有元素按位或不少于 $x$ 的子区间对数。
说明/提示
在第一个样例中,数组为 $[0, 3, 6, 1]$,操作如下:
1. 在区间 $[1, 4]$ 上,可以选择的对有 $(1, 3)$、$(1, 4)$、$(2, 3)$、$(2, 4)$ 和 $(3, 4)$;
2. 在区间 $[3, 4]$ 上,可以选择的对有 $(3, 4)$;
3. 第一个数被替换为 $7$,此时数组变为 $[7, 3, 6, 1]$;
4. 在区间 $[1, 4]$ 上,可以选择的对有 $(1, 1)$、$(1, 2)$、$(1, 3)$、$(1, 4)$、$(2, 3)$、$(2, 4)$ 和 $(3, 4)$;
5. 在区间 $[1, 3]$ 上,可以选择的对有 $(1, 1)$、$(1, 2)$、$(1, 3)$ 和 $(2, 3)$;
6. 在区间 $[1, 1]$ 上,可以选择的对有 $(1, 1)$;
7. 第三个数被替换为 $0$,此时数组变为 $[7, 3, 0, 1]$;
8. 在区间 $[1, 4]$ 上,可以选择的对有 $(1, 1)$、$(1, 2)$、$(1, 3)$ 和 $(1, 4)$。
在第二个样例中,数组为 $[6, 0, 3, 15, 2]$,操作如下:
1. 在区间 $[1, 5]$ 上,可以选择的对有 $(1, 3)$、$(1, 4)$、$(1, 5)$、$(2, 4)$、$(2, 5)$、$(3, 4)$、$(3, 5)$、$(4, 4)$ 和 $(4, 5)$;
2. 第四个数被替换为 $4$,此时数组变为 $[6, 0, 3, 4, 2]$;
3. 在区间 $[1, 5]$ 上,可以选择的对有 $(1, 3)$、$(1, 4)$、$(1, 5)$、$(2, 4)$、$(2, 5)$、$(3, 4)$ 和 $(3, 5)$;
4. 在区间 $[3, 5]$ 上,可以选择的对有 $(3, 4)$ 和 $(3, 5)$;
5. 在区间 $[1, 4]$ 上,可以选择的对有 $(1, 3)$、$(1, 4)$、$(2, 4)$ 和 $(3, 4)$。
由 ChatGPT 4.1 翻译