func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename T>   inline bool chkmin(T &a, const T &b) {     return a > b ? a = b, 1 : 0;   }   template <typename T>   inline bool chkmax(T &a, const T &b) {     return a < b ? a = b, 1 : 0;   }   template <typename T>   inline bool smin(T &a, const T &b) {     return a > b ? a = b : a;   }   template <typename T>   inline bool smax(T &a, const T &b) {     return a < b ? a = b : a;   }   const int N = (int)1 << 15, mod = (int)998244353;   int a[N], b[N], dp[N];   int pw(int a, int b) {     return b != 0 ? (long long)pw((long long)a * a % mod, b >> 1) *                         (b & 1 ? a : 1) % mod                   : 1;   }   void NTT(int a[], int lg, bool inverse) {     int N = 1 << lg;     for (int i = 0; i < N; ++i) {       int rev = 0;       for (int j = 0; j < lg; ++j)         if (i >> j & 1) rev |= 1 << (lg - j - 1);       if (rev > i) swap(a[rev], a[i]);     }     for (int len = 2; len <= N; len <<= 1) {       int wn = pw(3, (mod - 1) / len);       if (inverse) wn = pw(wn, mod - 2);       for (int j = 0; j < N; j += len) {         int w = 1;         for (int first = j, second = j + len / 2; second < j + len;              ++first, ++second) {           int u = a[first], v = (long long)a[second] * w % mod;           a[first] = u + v;           a[second] = u - v + mod;           while (a[first] >= mod) a[first] -= mod;           while (a[second] >= mod) a[second] -= mod;           w = (long long)w * wn % mod;         }       }     }     if (inverse) {       int div = pw(N, mod - 2);       for (int i = 0; i < N; ++i) a[i] = (long long)a[i] * div % mod;     }   }   int res[17][N], tmpa[17][N], tmpb[17][N];   void solve(int b, int e, int a[N], int d = 0) {     if (b + 1 == e) {       res[d][0] = 1;       res[d][1] = a[b];       return;     }     int m = b + e >> 1;     solve(b, m, a, d + 1);     for (int j = 0; j <= (m - b); ++j)       tmpa[d][j] = res[d + 1][j], res[d + 1][j] = 0;     solve(m, e, a, d + 1);     for (int j = 0; j <= (e - m); ++j)       tmpb[d][j] = res[d + 1][j], res[d + 1][j] = 0;     int lg = 0;     while ((1 << lg) <= e - b) ++lg;     NTT(tmpa[d], lg, false);     NTT(tmpb[d], lg, false);     for (int j = 0; j < (1 << lg); ++j)       res[d][j] = (long long)tmpa[d][j] * tmpb[d][j] % mod,       tmpa[d][j] = tmpb[d][j] = 0;     NTT(res[d], lg, true);   }   int32_t main() {     int n, k;     cin >> n >> k;     for (int j = 0; j < n; ++j) cin >> a[j];     int qm;     cin >> qm;     while (qm--) {       int c;       cin >> c;       if (c == 1) {         int q, p, d;         cin >> q >> p >> d;         --p;         for (int j = 0; j < n; ++j) b[j] = q - a[j];         b[p] = q - d;       } else {         int q, l, r, d;         cin >> q >> l >> r >> d;         --l;         for (int j = 0; j < n; ++j) b[j] = q - a[j];         for (int j = l; j < r; ++j) b[j] -= d;       }       for (int j = 0; j < n; ++j) b[j] = (b[j] % mod + mod) % mod;       memset(res, 0, sizeof res);       solve(0, n, b);       cout << res[0][k] <<   n ;     }   }   