#include <bits/stdc++.h>
using namespace std;
const long long mod = 998244353;
const long long maxn = 3e5 + 10;
inline void rd(long long &ret) {
  char c;
  ret = 0;
  while ((c = getchar()) < '0' || c > '9')
    ;
  while (c >= '0' && c <= '9') {
    ret = ret * 10 + (c - '0'), c = getchar();
  }
}
inline long long qpow(long long x, long long y) {
  long long res = 1;
  while (y) {
    if (y & 1) res = res * x % mod;
    x = x * x % mod;
    y >>= 1;
  }
  return res;
}
inline long long mul(long long x, long long y) { return x * y % mod; }
long long fac[maxn << 2], ifac[maxn << 2], pw[maxn << 2], ans[maxn << 2];
void init() {
  fac[0] = pw[0] = ifac[0] = 1;
  for (long long i = 1; i < maxn; i++)
    fac[i] = mul(fac[i - 1], i), pw[i] = mul(pw[i - 1], 2);
  ifac[maxn - 1] = qpow(fac[maxn - 1], mod - 2);
  for (long long i = maxn - 2; i; i--) ifac[i] = mul(ifac[i + 1], i + 1);
}
inline long long c(long long n, long long m) {
  if (n < m) return 0;
  return mul(fac[n], mul(ifac[n - m], ifac[m]));
}
long long r[maxn << 2];
inline void ntt(long long *x, long long lim, long long opt) {
  long long i, j, k, m, gn, g, tmp;
  for (i = 0; i < lim; ++i)
    if (r[i] < i) swap(x[i], x[r[i]]);
  for (m = 2; m <= lim; m <<= 1) {
    k = m >> 1;
    gn = qpow(3, (mod - 1) / m);
    for (i = 0; i < lim; i += m) {
      g = 1;
      for (j = 0; j < k; ++j, g = g * gn % mod) {
        tmp = x[i + j + k] * g % mod;
        x[i + j + k] = (x[i + j] - tmp + mod) % mod;
        x[i + j] = (x[i + j] + tmp) % mod;
      }
    }
  }
  if (opt == -1) {
    reverse(x + 1, x + lim);
    long long inv = qpow(lim, mod - 2);
    for (i = 0; i < lim; ++i) x[i] = x[i] * inv % mod;
  }
}
long long A[maxn << 2], B[maxn << 2], C[maxn << 2];
long long cnt[maxn << 2];
int main() {
  long long n, k;
  init();
  rd(n);
  rd(k);
  for (long long i = 1; i <= n; i++) {
    long long x;
    rd(x);
    cnt[x]++;
  }
  for (long long i = 1; i <= k; i++) {
    long long l;
    scanf("%lld", &l);
    long long c1 = 0, c2 = 0;
    for (long long j = 1; j < l; j++) {
      if (cnt[j] == 1)
        c1++;
      else if (cnt[j] >= 2)
        c2++;
    }
    long long len = 1;
    long long maxl = c1 + 2 * c2;
    while (len <= maxl) len <<= 1;
    for (long long j = 0; j < len; j++) {
      B[j] = c(c2 * 2, j);
      A[j] = mul(c(c1, j), pw[j]);
    }
    for (long long j = 0; j < len; ++j)
      r[j] = (j & 1) * (len >> 1) + (r[j >> 1] >> 1);
    ntt(A, len, 1);
    ntt(B, len, 1);
    for (long long j = 0; j < len; ++j) C[j] = A[j] * B[j] % mod;
    ntt(C, len, -1);
    for (long long j = 0; j < len; j++)
      ans[l + j + 1] = (ans[l + j + 1] + C[j]) % mod;
  }
  long long q;
  rd(q);
  for (long long i = 1; i <= q; i++) {
    long long x;
    rd(x);
    printf("%lld\n", ans[x >> 1]);
  }
  return 0;
}
