#include <bits/stdc++.h>   using namespace std;   using ll = long long;   const ll P = 998244353;   constexpr ll modPow(ll a, ll b, ll c) {     if ((b & 1) == 1) return a * modPow(a, b - 1, c) % c;     if (b == 0) return 1 % c;     return modPow(a * a % c, b / 2, c);   }   void bitReverse(vector<int>& vec) {     int n = vec.size();     int lg = 0;     while ((1 << lg) < n) ++lg;     for (int i = 0; i < n; ++i) {       int t = 0;       for (int j = 0; j < lg; ++j) {         if (i & (1 << j)) t |= 1 << (lg - 1 - j);       }       if (i < t) swap(vec[i], vec[t]);     }   }   void ntt(vector<int>& pol, bool inv) {     bitReverse(pol);     int n = pol.size();     int lg = 0;     while ((1 << lg) < n) ++lg;     ll nth_root = modPow(3, (P - 1) / n, P);     if (inv) nth_root = modPow(nth_root, n - 1, P);     vector<ll> pows(lg, nth_root);     for (int i = lg - 2; i >= 0; --i) pows[i] = (pows[i + 1] * pows[i + 1]) % P;     ll tmp = 1;     for (int i = 0; i < n; ++i) tmp = (tmp * nth_root) % P;     for (lg = 0; (1 << lg) < n; ++lg) {       int h = 1 << lg;       int len = h << 1;       ll root = pows[lg];       for (int j = 0; j < n; j += len) {         ll curr = 1;         for (int i = j; i < j + h; ++i) {           int tmp = (curr * pol[i + h]) % P;           curr = (curr * root) % P;           pol[i + h] = P - tmp + pol[i];           if (pol[i + h] >= P) pol[i + h] -= P;           pol[i] += tmp;           if (pol[i] >= P) pol[i] -= P;         }       }     }   }   vector<int> polyMult(vector<int> a, vector<int> b) {     int as = a.size();     int bs = b.size();     int n = 1;     while (n < (as + bs)) n <<= 1;     a.resize(n, 0);     b.resize(n, 0);     ntt(a, false);     ntt(b, false);     vector<int> c(n);     int n_inv = modPow(n, P - 2, P);     for (int i = 0; i < n; ++i) {       ll prod = (ll)a[i] * b[i] % P;       c[i] = prod * n_inv % P;     }     ntt(c, true);     c.resize(as + bs - 1);     return c;   }   const int N = 10 + 4 * (int)1e5;   ll fact[N];   ll inv_fact[N];   ll twop[N];   ll choose(int a, int b) {     if (b > a) return 0;     ll div = inv_fact[b] * inv_fact[a - b] % P;     return fact[a] * div % P;   }   vector<int> build(const vector<ll>& as, ll h) {     int n = as.size();     int x = 0, y = 0;     for (int i = 0; i < n && as[i] < h;) {       int j = i;       while (j < n && as[j] == as[i]) ++j;       if (j - i == 1)         ++x;       else         ++y;       i = j;     }     n = x + 2 * y + 1;     vector<int> vec1(n, 0), vec2(n, 0);     for (int i = 0; i < n; ++i) {       vec1[i] = choose(2 * y, i);       vec2[i] = choose(x, i) * twop[i] % P;     }     vector<int> res = polyMult(vec1, vec2);     while (res.back() == 0) res.pop_back();     return res;   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     fact[0] = 1;     twop[0] = 1;     inv_fact[0] = 1;     for (int i = 1; i < N; ++i) {       fact[i] = (i * fact[i - 1]) % P;       twop[i] = (2 * twop[i - 1]) % P;       inv_fact[i] = modPow(fact[i], P - 2, P);     }     int n, k;     cin >> n >> k;     vector<ll> as(n), bs(k);     for (int i = 0; i < n; ++i) cin >> as[i];     for (int i = 0; i < k; ++i) cin >> bs[i];     sort(as.begin(), as.end());     vector<vector<int>> dp(k);     for (int j = 0; j < k; ++j) dp[j] = build(as, bs[j]);     int q;     cin >> q;     for (int qi = 0; qi < q; ++qi) {       int t;       cin >> t;       ll res = 0;       for (int j = 0; j < k; ++j) {         int c = (t / 2) - bs[j] - 1;         if (c >= 0 && c < dp[j].size()) {           res += dp[j][c];         }       }       cout << (res % P) <<   n ;     }   }