func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename A, typename B>   ostream& operator<<(ostream& os, const pair<A, B>& x) {     return os <<  (  << x.first <<  ,  << x.second <<  ) ;   }   const int MOD = 998244353;   long long modex(long long a, long long p, long long m = MOD) {     if (!p) return 1;     if (p & 1) return a * modex(a, p - 1, m) % m;     long long v = modex(a, p >> 1, m);     return v * v % m;   }   namespace fft {   const int mod = 998244353;   const int gen = 3;   vector<int> rev(1, 0), roots;   int base = 0;   void precompute(int nbase) {     if (nbase <= base) return;     rev.resize(1 << nbase);     for (int i = 0; i < (1 << nbase); ++i) {       rev[i] = rev[i >> 1] >> 1 | ((i & 1) << nbase - 1);     }     roots.resize(1 << nbase);     for (; base < nbase; ++base) {       int len = 1 << base;       long long root = modex(gen, (mod - 1) >> base + 1, mod);       roots[len] = 1;       for (int i = 1; i < len; ++i)         roots[len + i] = roots[len + i - 1] * root % mod;     }   }   void fft(vector<int>& a) {     int n = a.size();     assert((n & (n - 1)) == 0);     int zeros = __builtin_ctz(n);     precompute(zeros);     int shift = base - zeros;     for (int i = 0; i < n; ++i) {       if (i < (rev[i] >> shift)) swap(a[i], a[rev[i] >> shift]);     }     for (int len = 1; len < n; len <<= 1)       for (int i = 0; i < n; i += 2 * len)         for (int j = 0; j < len; ++j) {           int u = a[i + j], v = (long long)a[i + j + len] * roots[len + j] % mod;           a[i + j] = u + v >= mod ? u + v - mod : u + v;           a[i + j + len] = u - v < 0 ? u - v + mod : u - v;         }   }   vector<int> multiply(vector<int> a, vector<int> b) {     if (a.empty() || b.empty()) return {};     int sz = a.size() + b.size() - 1;     int n = sz == 1 ? 1 : 1 << (32 - __builtin_clz(sz - 1));     bool eq = (a == b);     a.resize(n);     fft(a);     if (eq)       b = a;     else {       b.resize(n);       fft(b);     }     long long inv = modex(n, mod - 2, mod);     for (int i = 0; i < n; ++i) a[i] = (long long)a[i] * b[i] % mod * inv % mod;     fft(a);     reverse(a.begin() + 1, a.end());     a.resize(sz);     return a;   }   vector<int> multiply(const vector<int>& a, const vector<int>& b, int m) {     assert(m == mod);     return multiply(a, b);   }   };  // namespace fft   vector<int> B;   vector<int> multiplyAll(int s, int e) {     if (s == e) {       return {1, B[s]};     }     int m = (s + e) >> 1;     auto a = multiplyAll(s, m);     auto b = multiplyAll(m + 1, e);     return fft::multiply(a, b);   }   int sub(int x, int y) {     x -= y;     if (x < 0) x += MOD;     return x;   }   int main() {     int n, k;     scanf( %d%d , &n, &k);     vector<int> A(n);     B = vector<int>(n);     for (int i = 0; i < n; ++i) {       scanf( %d , &A[i]);       A[i] %= MOD;     }     int Q;     scanf( %d , &Q);     while (Q--) {       int t, q, a, b, d;       scanf( %d%d%d%d , &t, &q, &a, &b);       if (t == 1) {         b %= MOD;         for (int i = 0; i < n; ++i) B[i] = sub(q, A[i]);         B[a - 1] = sub(q, b);       } else {         scanf( %d , &d);         d %= MOD;         for (int i = 0; i < n; ++i) B[i] = sub(q, A[i]);         for (int i = a - 1; i < b; ++i) B[i] = sub(B[i], d);       }       auto p = multiplyAll(0, n - 1);       printf( %d n , p[k]);     }   }   