「LAOI-17」月時計
时间限制:C/C++/Rust/Pascal 5秒,其他语言10秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

\hspace{15pt}十六夜咲夜在幻想乡论坛看到了这样一个帖子:帖子中有一只兔子和一些妖精的回复,帖子回复共有 n 条,从上往下排成一列,其中第 i 条回复的类型为 a_i,兔子和妖精总共会进行三种类型的回复(冒号前面表示发送者,冒号后表示内容):
\hspace{23pt}\bullet\,类型一:「兔子:兔子楼上」;
\hspace{23pt}\bullet\,类型二:「兔子:兔子楼下」;
\hspace{23pt}\bullet\,类型三:「妖精:缓缓打出??」。
\hspace{15pt}显然,回复类型一要求这条回复存在下一条回复、且发送者是兔子;回复类型二要求这条回复存在上一条回复、且发送者是兔子;回复类型三没有额外要求,此时认为这些回复是合法的。

\hspace{15pt}现在这个帖子缺失了一些回复,这些缺失的回复用 a_i=0 表示,现在你需要处理 q 次操作或询问:
\hspace{23pt}\bullet\,对于操作,给定 x,y,将第 x 条回复的类型改为 y
\hspace{23pt}\bullet\,对于询问,给定 l,r,询问如果我们将子序列 a_l, a_{l+1}, \dots, a_r 视为一个全新且独立的帖(即 a_l 是第一条回复, a_r 是最后一条回复),有多少种方法可以补全其中的缺失回复(a_i=0 的那些),使得这个新序列是合法的。由于答案可能很大,请将答案对 998\,244\,353 取模后输出。若不存在合法方案则输出 0

输入描述:

\hspace{15pt}第一行输入两个整数 n,q \left(3\le n,q \le 10^6\right),表示帖子长度和询问次数。
\hspace{15pt}第二行输入 n 个整数 a_1,a_2,\dots,a_n \left(0\le a_i\le 3\right),表示帖子第 i 条回复的类型。
\hspace{15pt}此后 q 行,每行输入先输入一个整数 o \left(1\le o\le 2\right),表示操作类型,随后在同一行:
\hspace{23pt}\bullet\,o=1,输入两个整数 x,y \left(1\le x \le n,0\le y\le 3\right),表示将第 x 条回复的类型改为 y
\hspace{23pt}\bullet\,o=2,输入两个整数 l,r \left(1\le l \le r \le n\right),表示询问的区间。数据保证至少存在一次询问。

输出描述:

\hspace{15pt}对于每次询问,新起一行输出一个整数,表示对应询问的答案,对 998\,244\,353 取模。若不存在合法方案则输出 0
示例1

输入

复制
3 4
0 0 0
2 1 1
2 1 2
2 2 3
2 1 3

输出

复制
1
2
2
5
示例2

输入

复制
8 6
0 1 0 2 3 0 2 0
1 1 0
2 2 5
1 3 0
2 4 7
1 5 0
2 2 7

输出

复制
2
0
10