题目背景
在一次算法竞赛中,Oxy 遇到一个序列操作问题。他得到了一个长度为 n 的正整数序列,需要支持两种操作:区间更新和区间查询。
题目描述
Oxy 得到了一段长度为 n 的正整数序列 a1,a2,…,an,他需要支持两种操作:
- 1.
1 l r: 对于所有 l≤i≤r,将 ai 增加 lowbit(ai);
- 2.
2 l r: 查询区间 [l,r] 内所有元素的和。
其中,lowbit(x) 表示整数 x 的二进制表示中最低位的 1 所对应的数值,即
lowbit(x)=x&(−x)
特别规定:lowbit(0)=0。
例如:lowbit(4)=4,lowbit(5)=1。
对于每次查询操作,你需要输出区间和对模数 998244353 取模之后的结果。
输入格式
- 第一行:一个整数 n(1≤n≤105),表示序列长度。
- 第二行:n 个整数 a1,a2,…,an(1≤ai≤998244352),表示初始序列。
- 第三行:一个整数 q(1≤q≤105),表示操作次数。
- 接下来 q 行,每行三个整数 op,l,r(1≤op≤2, 1≤l≤r≤n):
- 若
op = 1:对区间 [l,r] 内的每个元素执行 ai←ai+lowbit(ai);
- 若
op = 2:查询当前区间 [l,r] 内所有元素之和,并输出对 998244353 取模的结果。
输出格式
对于每个查询(即每次 op = 2 的操作),输出一行一个整数,表示对应区间元素之和对 998244353 取模后的结果。
数据范围
- 1≤n≤105
- 1≤ai≤998244352
- 1≤q≤105
- 1≤op≤2
- 1≤l≤r≤n