编程题
### 问题描述 小蓝是一个魔术师,他正在蓝桥大剧院表演。 台上有一排 $n$ 个盒子,编号 $1 \sim n$。表演开始之前,助手会在每个盒子里放入一个小球,小球的颜色有三种,分别为红、黄、蓝。 小蓝有 $3$ 种魔术操作: 1. **颜色互换**,小蓝会选择一个区间 $[l,r]$ 和两种颜色 $a,b$,对于每一个盒子来说,如果它的编号在 $[l,r]$ 内,并且盒子内的球颜色为 $a$,那么盒子里球颜色变为 $b$,如果盒子里的球颜色为 $b$,那么盒子里球颜色变为 $a$。 2. **染色**,小蓝会选择一个区间 $[l,r]$ 和两种颜色 $a,b$,对于每一个盒子来说,如果它的编号在 $[l,r]$ 内,并且盒子内的球颜色为 $a$,那么盒子里球颜色变为 $b$。 3. **分裂**,小蓝会选择一个区间 $[l,r]$ 和一种颜色 $a$,对于每一个盒子来说,如果它的编号在 $[l,r]$ 内,并且盒子内的球颜色为 $a$,那么盒子里所有的球由一个分裂成两个。 **补充说明**:对于三种魔术,在区间内,如果不存在颜色 $a$ 的球,那么对于颜色 $a$ 的操作将不会发生;如果不存在颜色 $b$ 的球,那么同理;如果都不存在,那么什么都不会发生。 > 例如:对于颜色互换术而言,如果不存在颜色为 $a$ 的球,但是存在颜色为 $b$ 的球,那么颜色为 $b$ 的球将被变成 $a$,但是将没有颜色为 $a$ 的球变成 $b$。 小蓝会不断的重复上述三种操作。 你是小蓝的助手,每一次操作后,你都需要回答小蓝,每种颜色的球现在有多少个。答案可能很大,请对 $998244353$ 取模。 ### 输入格式 第一行输入两个整数 $n,m$。 接下来一行,输入 $n$ 个整数 $c_1, c_2, c_3,...,c_n$,每个盒子里球的初始颜色,为了方便,我们用数字 $1,2,3$ 来表示颜色红、黄。蓝,下述操作同理。 接下来 $m$ 行,每行包含一个操作,先输入三个整数 $l,r,opt$, $l,r$ 代表操作区间为编号在 $[l,r]$ 中的盒子,$opt$ 代表操作种类,后续输入如下: 1. 如果 $opt = 1$,输入两个整数 $a,b$,代表进行**颜色互换术**,将区间内 $a,b$ 颜色互换,即颜色为 $a$ 的球变为颜色 $b$,颜色为 $b$ 的球变为颜色 $a$。 2. 如果 $opt = 2$,输入两个整数 $a,b$,代表进行**染色术**,将区间内 $a$ 颜色球变为颜色 $b$。 3. 如果 $opt = 3$,输入一个整数 $a$,代表进行**分裂术**,将区间内所有 $a$ 颜色的球由一个分裂成两个。 ### 输出格式 输出 $m$ 行,每行三个整数,表示这次操作结束后,所有盒子中颜色分别为 $1,2,3$ 的球的数量,答案可能很大,请对 $998244353$ 取模。 ### 样例输入 ```bash 5 3 1 1 2 3 1 1 3 1 1 2 2 3 2 1 2 2 4 3 2 ``` ### 样例输出 ```bash 2 2 1 1 3 1 1 5 1 ``` ### 说明 第一次操作后:$\lbrace 2_1,2_1,1_1,3_1,1_1 \rbrace$。值代表该盒子里球的颜色,角标代表该盒子的球数量。 第二次操作后:$\lbrace 2_1,2_1,2_1,3_1,1_1 \rbrace$。 第三次操作后:$\lbrace 2_1,2_2,2_2,3_1,1_1 \rbrace$。 输入输出数据量较大,请使用较快的输入输出方式。 ### 评测数据范围 $1 \le n, m \le 10^5, 1 \le opt, c_i, a, b\le 3, 1\le l \le r \le n$。 保证 $a \neq b$。
查看答案
赣ICP备20007335号-2