#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;
}
