func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, K, b[40004], a[40004];   int Wl, Wl2, w[40004], lg[40004], inv[40004] = {1, 1};   int Pow(int b, int k) {     int r = 1;     for (; k; k >>= 1, b = 1ll * b * b % 998244353)       if (k & 1) r = 1ll * r * b % 998244353;     return r;   }   void init(int n) {     for (Wl = 1; n >= Wl << 1; Wl <<= 1)       ;     int pw = Pow(3, (998244353 - 1) / (Wl2 = Wl << 1));     w[Wl] = 1;     for (int i = (Wl + 1), LIM = (Wl2 - 1); i <= LIM; i++)       w[i] = 1ll * w[i - 1] * pw % 998244353;     for (int i = (Wl - 1), LIM = (1); i >= LIM; i--) w[i] = w[i << 1];     for (int i = (2), LIM = (Wl2); i <= LIM; i++)       inv[i] = 1ll * (998244353 - 998244353 / i) * inv[998244353 % i] % 998244353,       lg[i] = lg[i >> 1] + 1;   }   void NTT(int *A, int n, int tp) {     static int r[40004];     static unsigned long long a[40004];     if (tp ^ 1) reverse(A + 1, A + n);     for (int i = (0), LIM = (n - 1); i <= LIM; i++)       r[i] = r[i >> 1] >> 1 | (i & 1) << (lg[n] - 1),       a[i] = (A[r[i]] += A[r[i]] >> 31 & 998244353);     for (int L = 1; L < n; L <<= 1)       for (int s = 0, L2 = L << 1; s < n; s += L2)         for (int k = s, x = L, t; k < s + L; k++, x++)           t = w[x] * a[k + L] % 998244353, a[k + L] = a[k] - t + 998244353,           a[k] += t;     for (int i = (0), LIM = (n - 1); i <= LIM; i++) A[i] = a[i] % 998244353;     if (tp ^ 1)       for (int i = (0), LIM = (n - 1); i <= LIM; i++)         A[i] = 1ll * A[i] * inv[n] % 998244353;   }   void Mul(int *A, int *B, int *C, int n, int m) {     static int st[2][40004];     int L = 1 << lg[n + m] + 1;     for (int i = (0), LIM = (L - 1); i <= LIM; i++)       st[0][i] = i <= n ? A[i] : 0, st[1][i] = i <= m ? B[i] : 0;     NTT(st[0], L, 1), NTT(st[1], L, 1);     for (int i = (0), LIM = (L - 1); i <= LIM; i++)       C[i] = 1ll * st[0][i] * st[1][i] % 998244353;     NTT(C, L, -1);   }   int *f[40004 << 2];   void Build(int u, int l, int r) {     f[u] = new int[1 << lg[r - l + 1] + 1];     if (l == r) return;     int m = l + r >> 1;     Build(u << 1, l, m), Build(u << 1 | 1, m + 1, r);   }   void Sol(int u, int l, int r) {     memset(f[u], 0, 4 * (1 << lg[r - l + 1] + 1));     if (l == r) return (void)(f[u][0] = 1, f[u][1] = b[l]);     int m = l + r >> 1;     Sol(u << 1, l, m), Sol(u << 1 | 1, m + 1, r);     Mul(f[u << 1], f[u << 1 | 1], f[u], m - l + 1, r - m);   }   int main() {     scanf( %d%d , &n, &K);     for (int i = (1), LIM = (n); i <= LIM; i++) scanf( %d , &a[i]);     init(n);     int Q;     scanf( %d , &Q);     Build(1, 1, n);     for (int op, q, i, d, l, r; Q--;) {       scanf( %d , &op);       memcpy(b, a, sizeof b);       if (op == 1) {         scanf( %d%d%d , &q, &i, &d);         b[i] = d;       } else {         scanf( %d%d%d%d , &q, &l, &r, &d);         for (int j = l; j <= r; j++) b[j] = (b[j] + d) % 998244353;       }       for (int i = (1), LIM = (n); i <= LIM; i++) b[i] = (q - b[i]) % 998244353;       Sol(1, 1, n);       printf( %d n , (f[1][K] + 998244353) % 998244353);     }   }   