#include <bits/stdc++.h>
using namespace std;
const int prime = 999983;
const int INF = 0x7FFFFFFF;
const long long INFF = 0x7FFFFFFFFFFFFFFF;
const double pi = acos(-1.0);
const double inf = 1e18;
const double eps = 1e-6;
const int mod = 998244353;
long long qpow(long long a, long long b) {
  long long s = 1;
  while (b > 0) {
    if (b & 1) s = s * a % mod;
    a = a * a % mod;
    b >>= 1;
  }
  return s;
}
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
int dr[2][4] = {1, -1, 0, 0, 0, 0, -1, 1};
const int maxn = 6e5 + 10;
int A[maxn];
int B[10];
int Query[maxn];
const int g = 3;
int rev(int x, int r) {
  int ans = 0;
  for (int i = 0; i < r; i++) {
    if (x & (1 << i)) {
      ans += 1 << (r - i - 1);
    }
  }
  return ans;
}
void NTT(int n, long long A[], int on) {
  int r = 0;
  for (;; r++) {
    if ((1 << r) == n) break;
  }
  for (int i = 0; i < n; i++) {
    int tmp = rev(i, r);
    if (i < tmp) swap(A[i], A[tmp]);
  }
  for (int s = 1; s <= r; s++) {
    int m = 1 << s;
    long long wn = qpow(g, (mod - 1) / m);
    for (int k = 0; k < n; k += m) {
      long long w = 1;
      for (int j = 0; j < m / 2; j++) {
        long long t, u;
        t = w * (A[k + j + m / 2] % mod) % mod;
        u = A[k + j] % mod;
        A[k + j] = (u + t) % mod;
        A[k + j + m / 2] = ((u - t) % mod + mod) % mod;
        w = w * wn % mod;
      }
    }
  }
  if (on == -1) {
    for (int i = 1; i < n / 2; i++) swap(A[i], A[n - i]);
    long long inv = qpow(n, mod - 2);
    for (int i = 0; i < n; i++) A[i] = A[i] % mod * inv % mod;
  }
}
const int maxm = 2e6 + 10;
long long AA[maxm], BB[maxm];
int fac[maxn], invfac[maxn];
void init() {
  fac[0] = 1;
  int N = maxn - 1;
  for (int i = 1; i <= N; ++i) fac[i] = 1ll * fac[i - 1] * i % mod;
  invfac[N] = qpow(fac[N], mod - 2);
  for (int i = N - 1; i >= 0; --i)
    invfac[i] = 1ll * invfac[i + 1] * (i + 1) % mod;
}
long long CC(long long n, long long m) {
  return 1ll * fac[n] * invfac[n - m] % mod * invfac[m] % mod;
}
int Ans[maxn];
int main(void) {
  init();
  int n, k;
  cin >> n >> k;
  for (int i = 1; i <= n; ++i) {
    int a;
    scanf("%d", &a);
    A[a]++;
  }
  for (int i = 1; i <= k; ++i) cin >> B[i];
  int Q;
  cin >> Q;
  for (int i = 1; i <= Q; ++i) scanf("%d", &Query[i]);
  for (int now = 1; now <= k; ++now) {
    int cnt1, cnt2;
    cnt1 = cnt2 = 0;
    for (int i = 1; i < B[now]; ++i) {
      if (A[i] == 1)
        cnt1++;
      else if (A[i] >= 2)
        cnt2++;
    }
    int t = 1;
    for (int i = 0; i <= cnt1; ++i) {
      AA[i] = CC(cnt1, i) * t % mod;
      t = t * 2 % mod;
    }
    BB[0] = 1;
    for (int i = 1; i <= 2 * cnt2; ++i) {
      BB[i] = CC(2 * cnt2, i);
    }
    t = cnt1 + 2 * cnt2 + 1;
    int N = 1;
    while (N <= t) N <<= 1;
    for (int i = cnt1 + 1; i <= N; ++i) AA[i] = 0;
    for (int i = 2 * cnt2 + 1; i <= N; ++i) BB[i] = 0;
    NTT(N, AA, 1);
    NTT(N, BB, 1);
    for (int i = 0; i < N; ++i) AA[i] = 1ll * AA[i] * BB[i] % mod;
    NTT(N, AA, -1);
    for (int i = 1; i <= Q; ++i) {
      int len = 2 * B[now] + 2;
      int t = (Query[i] - len) / 2;
      if (len <= Query[i] && t < N) {
        Ans[i] = (Ans[i] + AA[t]) % mod;
      }
    }
  }
  for (int i = 1; i <= Q; ++i) printf("%d\n", Ans[i]);
  return 0;
}
