#Q0108. Lowbit

Lowbit

题目描述

OxyOxy 得到了一段长度为 nn 的正整数序列 a1,a2,,ana_1, a_2, \ldots, a_n。他需要支持两种操作:

  • 1\text{1} ll rr:对于所有 lirl \leq i \leq r,将 aia_i 增加 lowbit(ai)\mathrm{lowbit}(a_i)
  • 2\text{2} ll rr:查询区间 [l,r][l, r] 内所有元素的和。

其中,lowbit(x)\mathrm{lowbit}(x) 表示整数 xx 的二进制表示中最低位的 11 所对应的数值,即

lowbit(x)=x&(x)\mathrm{lowbit}(x)=x \& (-x)

例如 lowbit(4)=4\mathrm{lowbit}(4)=4lowbit(5)=1\mathrm{lowbit}(5)=1,以及特别地,lowbit(0)=0\mathrm{lowbit}(0)=0

对于每次查询操作,你需要输出区间和对模数 998244353998244353 取模后的结果。

输入格式

第一行包含一个整数 nn1n1051 \leq n \leq 10^5)--- 序列的长度。

第二行包含 nn 个整数 a1,a2,,ana_1, a_2, \cdots, a_n (1ai9982443521 \leq a_i \leq 998244352) --- 初始序列。

第三行包含一个整数 qq (1q1051 \leq q \leq 10^5)--- 操作的数量。

接下来的 qq 行中,每行包含三个整数 op,l,rop, l, r (1op21 \le op \le 21lrn1 \le l \le r \le n),表示一次操作:

  • op=1op = 1,对区间 [l,r][l, r] 内每个元素执行 aiai+lowbit(ai)a_i \leftarrow a_i + \mathrm{lowbit}(a_i)
  • op=2op = 2,询问当前区间 [l,r][l, r] 内所有元素之和。

输出格式

对于每个询问,输出区间元素之和对 998244353998244353 取模的结果。

样例

6
1 2 3 4 5 6
5
1 3 6
2 1 4
1 1 5
2 1 6
2 3 6

15
46
40

1
998244352
2
1 1 1
2 1 1

8388607