解题思路
区间先拼三进制,再把 0 与 2 互换并整串翻转,等于把每个数各自「倒序再互换」之后,从右往左拼起来。
- 令 f(x) 为 x 的三进制(无前导零)倒序并把 0↔2 后的数值和位数。x=‘0‘ 时 f(x)=2,位数为
1。
- 询问 [l,r] 就是把 f(ar),f(ar−1),…,f(al) 依次拼成一个三进制数。两段 A,B 拼接为 A⋅3∣B∣+B。
- 用线段树维护每个区间「从右到左拼接」的结果:合并时右儿子(下标更大)放在高位。
- 单点修改只重算一片叶子。位数最多约 20m,预处理 3kmod998244353。