#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const long long LINF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-12;
const double PI = acos(-1.0);
const double angcst = PI / 180.0;
const long long mod = 998244353;
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
long long qmul(long long a, long long b) {
  long long r = 0;
  while (b) {
    if (b & 1) r = (r + a) % mod;
    b >>= 1;
    a = (a + a) % mod;
  }
  return r;
}
long long qpow(long long a, long long n) {
  long long r = 1;
  while (n) {
    if (n & 1) r = (r * a) % mod;
    n >>= 1;
    a = (a * a) % mod;
  }
  return r;
}
long long qpow(long long a, long long n, long long p) {
  long long r = 1;
  while (n) {
    if (n & 1) r = (r * a) % p;
    n >>= 1;
    a = (a * a) % p;
  }
  return r;
}
const int N = 1 << 21;
long long fac[N + 1], inv[N + 1];
void init() {
  fac[0] = 1;
  for (int i = 1; i <= N; i++) fac[i] = fac[i - 1] * i % mod;
  inv[N] = qpow(fac[N], mod - 2);
  for (int i = N - 1; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % mod;
}
long long getC(long long m, long long n) {
  if (m < 0 | m - n < 0 || n < 0) return 0;
  return fac[m] * inv[m - n] % mod * inv[n] % mod;
}
long long getA(long long m, long long n) { return fac[m] * inv[m - n] % mod; }
int lim = 1, rev[N];
void NTT(int *a, int n, int op) {
  for (int i = 0; i < n; i++)
    if (i < rev[i]) swap(a[i], a[rev[i]]);
  for (int mid = 1; mid < n; mid <<= 1) {
    long long tmp;
    if (op == 1)
      tmp = qpow(3, (mod - 1) / (mid << 1));
    else
      tmp = qpow(3, mod - 1 - (mod - 1) / (mid << 1));
    for (int i = 0; i < n; i += (mid << 1)) {
      long long omega = 1;
      for (long long j = 0; j < mid; ++j, omega = omega * tmp % mod) {
        long long x = a[i + j], y = omega * a[i + j + mid] % mod;
        a[i + j] = (x + y) % mod, a[i + j + mid] = (x - y + mod) % mod;
      }
    }
  }
  if (op == -1) {
    long long inv = qpow(n, mod - 2);
    for (int i = 0; i < n; i++) a[i] = a[i] * inv % mod;
  }
}
void initNTT(int n) {
  int lg = 0;
  lim = 1;
  while (lim <= n) lg++, lim <<= 1;
  for (int i = (0); i < (lim); i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (lg - 1));
}
int f[6][N];
int g[6][N];
int cnt[300050];
int b[10];
void solve() {
  int n, k, d;
  cin >> n >> k;
  for (int i = (1); i <= (n); i++) {
    cin >> d;
    cnt[d] = min(cnt[d] + 1, 2);
  }
  for (int i = (1); i <= (k); i++) {
    cin >> d;
    b[i] = d;
    int c1 = 0, c2 = 0;
    for (int j = (0); j < (d); j++)
      if (cnt[j] == 1)
        c1++;
      else if (cnt[j] == 2)
        c2++;
    for (int j = (0); j <= (c1); j++) f[i][j] = getC(c1, j) * qpow(2, j) % mod;
    for (int j = (0); j <= (2 * c2); j++) g[i][j] = getC(2 * c2, j);
    initNTT(c1 + 2 * c2);
    NTT(f[i], lim, 1);
    NTT(g[i], lim, 1);
    for (int j = (0); j < (lim); j++) f[i][j] = 1LL * f[i][j] * g[i][j] % mod;
    NTT(f[i], lim, -1);
  }
  int q;
  cin >> q;
  while (q--) {
    int Q;
    cin >> Q;
    Q >>= 1;
    long long ans = 0;
    for (int i = (1); i <= (k); i++)
      if (Q - (b[i] + 1) >= 0) ans = (ans + f[i][Q - (b[i] + 1)]) % mod;
    cout << ans << '\n';
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  init();
  { solve(); }
  return 0;
}
