#include <bits/stdc++.h>
using namespace std;
template <typename T>
void chkmax(T &x, T y) {
  x = x > y ? x : y;
}
template <typename T>
void chkmin(T &x, T y) {
  x = x < y ? x : y;
}
template <typename T>
void read(T &x) {
  x = 0;
  int f = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (isdigit(c)) x = x * 10 + c - '0', c = getchar();
  x *= f;
}
const int N = 1200010, mod = 998244353;
int pw[N], fac[N], inv[N], Inv[N];
namespace poly {
int rev[N];
int Pow(int x, int y) {
  int ret = 1;
  for (; y; y >>= 1, x = 1ll * x * x % mod)
    if (y & 1) ret = 1ll * ret * x % mod;
  return ret;
}
int getl(int n) {
  int tn = 1, l = 0;
  while (tn <= n) tn <<= 1, l++;
  for (int i = 0; i < tn; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << l - 1);
  return tn;
}
void NTT(int *a, int n, int fl) {
  for (int i = 0; i < n; i++)
    if (i < rev[i]) swap(a[i], a[rev[i]]);
  for (int i = 1; i < n; i <<= 1) {
    int wn =
        Pow(3, ~fl ? (mod - 1) / (i << 1) : mod - 1 - (mod - 1) / (i << 1));
    for (int j = 0; j < n; j += i << 1)
      for (int k = 0, w = 1; k < i; k++, w = 1ll * w * wn % mod) {
        int tx = a[j + k], ty = 1ll * w * a[i + j + k] % mod;
        a[j + k] = (tx + ty) % mod, a[i + j + k] = (tx - ty + mod) % mod;
      }
  }
  if (fl == -1) {
    int t = Pow(n, mod - 2);
    for (int i = 0; i < n; i++) a[i] = 1ll * a[i] * t % mod;
  }
}
}  // namespace poly
using namespace poly;
int C(int n, int m) { return 1ll * fac[n] * Inv[m] % mod * Inv[n - m] % mod; }
void Init(int n) {
  fac[0] = fac[1] = Inv[0] = Inv[1] = inv[1] = pw[0] = 1;
  for (int i = 1; i <= n; i++) pw[i] = 2ll * pw[i - 1] % mod;
  for (int i = 2; i <= n; i++) {
    inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
    Inv[i] = 1ll * Inv[i - 1] * inv[i] % mod;
    fac[i] = 1ll * fac[i - 1] * i % mod;
  }
}
int main() {
  int n, k;
  read(n), read(k), Init(6e5);
  static int a[N], f[N], g[N], h[N], ans[6][N];
  for (int i = 1; i <= n; i++) read(a[i]);
  sort(a + 1, a + n + 1);
  for (int t = 1, x; t <= k; t++) {
    int tn = 0, tm = 0;
    read(x), h[t] = x;
    for (int i = 1; i <= n; i++) {
      if (a[i] >= x) break;
      int j = i;
      while (j < n && a[j + 1] == a[i]) j++;
      if (i != j)
        tm += 2;
      else
        tn++;
      i = j;
    }
    for (int i = 0; i <= tn; i++) f[i] = 1ll * C(tn, i) * pw[i] % mod;
    for (int i = 0; i <= tm; i++) g[i] = C(tm, i);
    int len = getl(tn + tm);
    NTT(f, len, 1), NTT(g, len, 1);
    for (int i = 0; i < len; i++) f[i] = 1ll * f[i] * g[i] % mod;
    NTT(f, len, -1);
    for (int i = 0; i <= tn + tm; i++) ans[t][i] = f[i];
    for (int i = 0; i < len; i++) f[i] = g[i] = 0;
  }
  int q;
  read(q);
  while (q--) {
    int tq, ret = 0;
    read(tq);
    for (int i = 1; i <= k; i++) {
      int tmp = tq / 2 - h[i] - 1;
      if (tmp < 0) continue;
      (ret += ans[i][tmp]) %= mod;
    }
    printf("%d\n", ret);
  }
  return 0;
}
