#include <bits/stdc++.h>
using namespace std;
const int M = ((int)3e5 + 23) << 3;
const int mod = 998244353;
const int MAXL = 22;
const int MAXN = 1 << MAXL;
const int Mod = 998244353;
int rev[MAXN], A[MAXN], B[MAXN], C[MAXN];
int fast_pow(int a, int b) {
  int ans = 1;
  while (b) {
    if (b & 1) ans = 1ll * ans * a % Mod;
    a = 1ll * a * a % Mod;
    b >>= 1;
  }
  return ans;
}
void transform(int n, int *t, int typ) {
  for (int i = 0; i < n; i++)
    if (i < rev[i]) swap(t[i], t[rev[i]]);
  for (int step = 1; step < n; step <<= 1) {
    int gn = fast_pow(3, (Mod - 1) / (step << 1));
    for (int i = 0; i < n; i += (step << 1)) {
      int g = 1;
      for (int j = 0; j < step; j++, g = 1ll * g * gn % Mod) {
        int x = t[i + j], y = 1ll * g * t[i + j + step] % Mod;
        t[i + j] = (x + y) % Mod;
        t[i + j + step] = (x - y + Mod) % Mod;
      }
    }
  }
  if (typ == 1) return;
  for (int i = 1; i < n / 2; i++) swap(t[i], t[n - i]);
  int inv = fast_pow(n, Mod - 2);
  for (int i = 0; i < n; i++) t[i] = 1ll * t[i] * inv % Mod;
}
void ntt(int p, int *A, int *B, int *C) {
  transform(p, A, 1);
  transform(p, B, 1);
  for (int i = 0; i < p; i++) C[i] = 1ll * A[i] * B[i] % Mod;
  transform(p, C, -1);
}
int ans[(int)2e6];
int cnt[M];
int red[10];
int query[M];
int fac[M], inv[M];
inline int Comb(int i, int j) {
  if (i < j) return 0;
  long long res = 1LL * fac[i] * inv[j] % mod;
  return res * inv[i - j] % mod;
}
int qpow(int a, int b) {
  long long ans = 1, base = a;
  while (b) {
    if (b & 1) ans = ans * base % mod;
    b >>= 1;
    base = base * base % mod;
  }
  return ans;
}
signed main() {
  int n, m, k;
  scanf("%d%d", &n, &k);
  fac[0] = 1;
  for (int i = 1; i <= n; i++) fac[i] = 1LL * fac[i - 1] * i % mod;
  inv[n] = qpow(fac[n], mod - 2);
  for (int i = n - 1; i >= 0; i--) inv[i] = 1LL * inv[i + 1] * (i + 1) % mod;
  for (int i = 0; i < n; i++) {
    int u;
    scanf("%d", &u);
    cnt[u]++;
  }
  for (int i = 0; i < k; i++) scanf("%d", red + i);
  for (int i = 0; i < k; i++) {
    memset(A, 0, sizeof(A));
    memset(B, 0, sizeof(B));
    int c1 = 0, c2 = 0;
    for (int j = 0; j < red[i]; j++) {
      if (cnt[j] == 1)
        c1++;
      else if (cnt[j] > 1)
        c2 += 2;
    }
    int P = 1;
    for (int j = 0; j <= c1; j++) {
      A[j] = 1LL * Comb(c1, j) * P % mod;
      P = (P * 2) % mod;
    }
    reverse(A, A + c1 + 1);
    n = c1;
    for (int j = 0; j <= c2; j++) {
      B[j] = Comb(c2, j);
    }
    reverse(B, B + c2 + 1);
    m = c2;
    int p = 1, l = 0;
    while (p <= n + m) p <<= 1, l++;
    for (int i = 0; i < p; i++)
      rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (l - 1));
    ntt(p, A, B, C);
    reverse(C, C + (n + m + 1));
    for (int j = 0; j <= n + m; j++) {
      C[j] = (C[j] + mod) % mod;
      int t = red[i] * 2 + j * 2 + 2;
      ans[t] = (ans[t] + C[j]) % mod;
    }
  }
  int T;
  cin >> T;
  while (T--) scanf("%d", &m), printf("%d\n", ans[m]);
}
