#include <bits/stdc++.h>
using namespace std;
const int MOD = 998244353;
int a[20005], b[20005];
struct FFTmod {
  const static int LOGN = 16;
  const static int MAXN = 1 << LOGN;
  const double PI = acos(-1);
  int lg2(int n) { return 32 - __builtin_clz(n - 1); }
  int rev[MAXN];
  complex<double> rt[MAXN];
  void precalc() {
    rt[1] = complex<double>{1, 0};
    for (int k = 2; k < MAXN; k *= 2) {
      complex<double> z[] = {1, polar(1.0, PI / k)};
      for (int i = k; i < 2 * k; i++) rt[i] = rt[i / 2] * z[i & 1];
    }
  }
  void fft(complex<double> *a, int n) {
    for (int i = 0; i < n; i++) rev[i] = (rev[i / 2] | (i & 1) << lg2(n)) / 2;
    for (int i = 0; i < n; i++)
      if (i < rev[i]) swap(a[i], a[rev[i]]);
    for (int k = 1; k < n; k *= 2)
      for (int i = 0; i < n; i += 2 * k)
        for (int j = 0; j < k; j++) {
          auto x = (double *)&rt[j + k], y = (double *)&a[i + j + k];
          complex<double> z(x[0] * y[0] - x[1] * y[1],
                            x[0] * y[1] + x[1] * y[0]);
          a[i + j + k] = a[i + j] - z;
          a[i + j] += z;
        }
  }
  complex<double> X[2][MAXN], Y[2][MAXN];
  vector<long long> multiply(const vector<long long> &a,
                             const vector<long long> &b) {
    int cut = sqrt(MOD), sz = a.size() + b.size() - 1;
    int n = 1 << lg2(sz);
    fill(X[0], X[0] + n, complex<double>{0, 0}),
        fill(X[1], X[1] + n, complex<double>{0, 0});
    vector<long long> res(sz);
    for (int i = 0; i < a.size(); i++)
      X[0][i] = {(double)(a[i] / cut), (double)(a[i] % cut)};
    for (int i = 0; i < b.size(); i++)
      X[1][i] = {(double)(b[i] / cut), (double)(b[i] % cut)};
    fft(X[0], n), fft(X[1], n);
    for (int i = 0; i < n; i++) {
      int j = (n - i) & (n - 1);
      complex<double> fl = (X[0][i] + conj(X[0][j])) * complex<double>{0.5, 0},
                      fs = (X[0][i] - conj(X[0][j])) * complex<double>{0, -0.5},
                      gl = (X[1][i] + conj(X[1][j])) * complex<double>{0.5, 0},
                      gs = (X[1][i] - conj(X[1][j])) * complex<double>{0, -0.5};
      Y[0][-i & (n - i)] = (fl * gl) + (fl * gs) * complex<double>{0, 1};
      Y[1][-i & (n - i)] = (fs * gl) + (fs * gs) * complex<double>{0, 1};
    }
    fft(Y[0], n), fft(Y[1], n);
    for (int i = 0; i < sz; i++) {
      Y[0][i] /= n, Y[1][i] /= n;
      long long av = round(Y[0][i].real());
      long long bv = round(Y[0][i].imag()) + round(Y[1][i].real());
      long long cv = round(Y[1][i].imag());
      av %= MOD, bv %= MOD, cv %= MOD;
      res[i] = av * cut * cut + bv * cut + cv;
      res[i] = (res[i] % MOD + MOD) % MOD;
    }
    return res;
  }
} fft;
vector<long long> poly[20005];
vector<long long> solve(int s, int e) {
  if (s == e)
    return poly[s];
  else {
    int mid = (s + e) / 2;
    return fft.multiply(solve(s, mid), solve(mid + 1, e));
  }
}
int main() {
  int n, k;
  scanf("%d%d", &n, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  fft.precalc();
  int q;
  scanf("%d", &q);
  for (int i = 1; i <= q; i++) {
    int t;
    scanf("%d", &t);
    if (t == 1) {
      int q, i, d;
      scanf("%d%d%d", &q, &i, &d);
      for (int i = 1; i <= n; i++) b[i] = (q - a[i] + MOD) % MOD;
      b[i] = (q - d + MOD) % MOD;
      for (int i = 1; i <= n; i++) {
        poly[i].clear();
        poly[i].emplace_back(1);
        poly[i].emplace_back(b[i]);
      }
      printf("%d\n", solve(1, n)[k]);
    } else {
      int q, l, r, d;
      scanf("%d%d%d%d", &q, &l, &r, &d);
      for (int i = 1; i <= n; i++) {
        if (l <= i && i <= r)
          b[i] = (q - (a[i] + d) + MOD) % MOD;
        else
          b[i] = (q - a[i] + MOD) % MOD;
      }
      for (int i = 1; i <= n; i++) {
        poly[i].clear();
        poly[i].emplace_back(1);
        poly[i].emplace_back(b[i]);
      }
      printf("%d\n", solve(1, n)[k]);
    }
  }
}
