#include <bits/stdc++.h>   using namespace std;   template <typename T>   T extGcd(T a, T b, T &x, T &y);   template <typename T>   T modInv(T a, T m);   const int mod = (119 << 23) + 1, root = 62;   template <int maxn>   struct NTT {     constexpr static int lg2(int n) { return 32 - __builtin_clz(n - 1); }     const static int MAXN = 1 << lg2(maxn), MOD = 998244353, root = 3;     int rev[MAXN], rt[MAXN];     int mul(int a, int b) { return (long long)a * b % MOD; }     int sub(int a, int b) { return b > a ? a - b + MOD : a - b; }     int add(int a, int b) { return a + b >= MOD ? a + b - MOD : a + b; }     int binExp(int base, long long exp) {       if (exp == 0) return 1;       return mul(binExp(mul(base, base), exp / 2), exp & 1 ? base : 1);     }     NTT() {       rt[1] = 1;       for (int k = 1; k < lg2(MAXN); k++) {         int z[] = {1, binExp(root, (MOD - 1) >> (k + 1))};         for (int i = (1 << k); i < 2 << k; i++) rt[i] = mul(rt[i / 2], z[i & 1]);       }     }     void ntt(int *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++) {             int z = mul(rt[j + k], a[i + j + k]);             a[i + j + k] = sub(a[i + j], z);             a[i + j] = add(a[i + j], z);           }     }     int in[2][MAXN];     vector<int> multiply(const vector<int> &a, const vector<int> &b) {       fill(begin(in[0]), end(in[0]), 0), fill(begin(in[1]), end(in[1]), 0);       if (a.empty() || b.empty()) return {};       int sz = a.size() + b.size() - 1, n = 1 << lg2(sz);       copy(begin(a), end(a), in[0]), copy(begin(b), end(b), in[1]);       ntt(in[0], n), ntt(in[1], n);       int invN = binExp(n, MOD - 2);       for (int i = 0; i < n; i++) in[0][i] = mul(mul(in[0][i], in[1][i]), invN);       reverse(in[0] + 1, in[0] + n);       ntt(in[0], n);       return vector<int>(in[0], in[0] + sz);     }   };   NTT<524288> ntt;   using namespace std;   int ppp, k;   vector<int> ans;   vector<int> queries;   map<int, int> white;   vector<int> red;   vector<int> one = {1, 2};   vector<int> two = {1, 2, 1};   int modpow(int b, int e) {     int r = 1;     while (e) {       if (e & 1) r = (r * 1ll * b) % mod;       b = (b * 1ll * b) % mod;       e >>= 1;     }     return r;   }   vector<long long> rt(524288, 1), rev(524288);   void solve_red(int red) {     int n = 524288;     vector<int> poly(524288);     poly[0] = 1;     ntt.ntt(poly.data(), 524288);     int o = 0, t = 0;     for (auto it : white) {       if (it.first >= red) continue;       if (it.second == 1)         o++;       else         t++;     }     vector<int> out(n);     long long inv = modpow(n, mod - 2);     for (int i = 0; i < 524288; i++) {       out[-i & (n - 1)] = (poly[i] * 1ll * modpow(one[i], o)) % mod;       out[-i & (n - 1)] = (out[-i & (n - 1)] * 1ll * modpow(two[i], t)) % mod;       out[-i & (n - 1)] = (out[-i & (n - 1)] * 1ll * inv) % mod;     }     ntt.ntt(out.data(), 524288);     for (int i = 0; i < queries.size(); i++) {       int rem = queries[i] - red - 1;       if (rem >= 0 && rem < 524288) {         ans[i] = (ans[i] + out[rem]) % mod;       }     }   }   void solve() {     one.resize(524288);     two.resize(524288);     int B = 19;     int n = 524288;     for (int i = 0; i < n; i++) rev[i] = (rev[i / 2] | (i & 1) << B) / 2;     long long curL = mod / 2, inv = modpow(n, mod - 2);     for (int k = 2; k < n; k *= 2) {       long long z[] = {1, modpow(root, curL /= 2)};       for (int i = k; i < 2 * k; i++) rt[i] = rt[i / 2] * z[i & 1] % mod;     }     ntt.ntt(one.data(), 524288);     ntt.ntt(two.data(), 524288);     scanf( %d %d , &ppp, &k);     int w;     for (int i = 0; i < ppp; i++) {       scanf( %d , &w);       white[w]++;       if (white[w] >= 2) white[w] = 2;     }     red.resize(k);     for (int i = 0; i < k; i++) scanf( %d , &red[i]);     int q;     scanf( %d , &q);     ans.resize(q);     queries.resize(q);     for (int i = 0; i < q; i++) {       scanf( %d , &queries[i]);       queries[i] /= 2;     }     for (int r : red) solve_red(r);     for (int a : ans) printf( %d n , a);   }   int main() { solve(); }   template <typename T>   T extGcd(T a, T b, T &x, T &y) {     if (b == 0) {       x = 1;       y = 0;       return a;     } else {       int g = extGcd(b, a % b, y, x);       y -= a / b * x;       return g;     }   }   template <typename T>   T modInv(T a, T m) {     T x, y;     extGcd(a, m, x, y);     return (x % m + m) % m;   }