def conv(a: list[int], b: list[int]) -> list[int]: n = len(a) m = len(b) c = [0] * (n + m - 1) for i in range(n): for j in range(m): c[i + j] += a[i] * b[j] c[i + j] %= Mod return c def multi_conv(polys: list[list[int]]) -> list[int]: a = [1] for poly in polys: a = conv(a, poly) return a def left(S: list[str], j: int) -> int: for i in range(j - 1, 0, -1): if S[i] == "B": return i else: return 0 def right(S: list[str], j: int) -> int: for i in range(j, len(S)): if S[i] == "B": return i else: return len(S) def fetch_polynomial(d: int, p: int): a = [0] * (d + 1) a[d] += p a[0] += 1 - p return a def solve(): from collections import defaultdict N, Q = map(int, input().split()) S = list(f"*{input().strip()}") S[N] = "B" W = list(map(int, input().split())) ans = [] for _ in range(Q): mode, *options = map(int, input().split()) if mode == 1: l, r = options for i in range(l, min(r, N - 1) + 1): S[i] = "G" if S[i] == "B" else "B" elif mode == 2: l, r, b = options for i in range(l, r + 1): W[i] += b elif mode == 3: v, K = options u = list(map(int, input().split())) D = defaultdict(int) less = 0 for k in range(K): if u[k] < v: less += 1 continue D[left(S, u[k])] += 1 t = left(S, v) p = sum(W[j] for j in range(v, right(S, v) + 1)) * pow(sum(W[j] for j in range(right(S, v) + 1)), -1, Mod) % Mod res = [1 if d == D[t] else 0 for d in range(D[t] + 1)] for s in D: if s == t: continue res = conv(res, fetch_polynomial(D[s], p)) ans.append(res + [0] * less) return ans #================================================== import sys input = sys.stdin.readline write = sys.stdout.write Mod = 998244353 to_string = lambda P: " ".join(map(str, P)) write("\n".join(map(to_string, solve())))