#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int out = 0, fh = 1;
  char jp = getchar();
  while ((jp > '9' || jp < '0') && jp != '-') jp = getchar();
  if (jp == '-') fh = -1, jp = getchar();
  while (jp >= '0' && jp <= '9') out = out * 10 + jp - '0', jp = getchar();
  return out * fh;
}
const int P = 998244353, G = 3;
int add(int a, int b) { return (a + b >= P) ? (a + b - P) : (a + b); }
int mul(int a, int b) { return 1LL * a * b % P; }
int fpow(int a, int b) {
  int res = 1;
  while (b) {
    if (b & 1) res = mul(res, a);
    a = mul(a, a);
    b >>= 1;
  }
  return res;
}
const int MAXN = 1.8e6 + 10;
int omega[MAXN], inv[MAXN], rev[MAXN], curn;
void NTT_init(int n) {
  if (curn == n) return;
  for (int i = 0; i < n; ++i)
    rev[i] = (rev[i >> 1] >> 1) | ((n >> 1) * (i & 1));
  for (int l = 2; l <= n; l <<= 1) {
    omega[l] = fpow(G, (P - 1) / l);
    inv[l] = fpow(omega[l], P - 2);
  }
  curn = n;
}
void DFT(int *a, int n, bool invflag) {
  NTT_init(n);
  for (int i = 0; i < n; ++i)
    if (i < rev[i]) swap(a[i], a[rev[i]]);
  for (int l = 2; l <= n; l <<= 1) {
    int m = (l >> 1);
    int gi = omega[l];
    if (invflag) gi = inv[l];
    for (int *p = a; p != a + n; p += l) {
      int g = 1;
      for (int i = 0; i < m; ++i) {
        int t = mul(g, p[i + m]);
        p[i + m] = add(p[i], P - t);
        p[i] = add(p[i], t);
        g = mul(g, gi);
      }
    }
  }
  if (invflag) {
    int invn = fpow(n, P - 2);
    for (int i = 0; i < n; ++i) a[i] = mul(a[i], invn);
  }
}
int NTT_A[MAXN], NTT_B[MAXN];
void NTT(int *A, int *B, int *C, int lenA, int lenB) {
  int lenC = lenA + lenB - 1, n = 1;
  while (n < lenC) n <<= 1;
  for (int i = 0; i < lenA; ++i) NTT_A[i] = A[i];
  for (int i = lenA; i < n; ++i) NTT_A[i] = 0;
  for (int i = 0; i < lenB; ++i) NTT_B[i] = B[i];
  for (int i = lenB; i < n; ++i) NTT_B[i] = 0;
  DFT(NTT_A, n, false);
  DFT(NTT_B, n, false);
  for (int i = 0; i < n; ++i) C[i] = mul(NTT_A[i], NTT_B[i]);
  DFT(C, n, true);
}
int n, k, fac[MAXN], invfac[MAXN], pw2[MAXN];
void init() {
  int m = n << 1;
  fac[0] = pw2[0] = 1;
  for (int i = 1; i <= m; ++i) {
    fac[i] = mul(fac[i - 1], i);
    pw2[i] = mul(pw2[i - 1], 2);
  }
  invfac[m] = fpow(fac[m], P - 2);
  for (int i = m - 1; i >= 0; --i) invfac[i] = mul(invfac[i + 1], i + 1);
}
int binom(int M, int N) {
  if (M < N || N < 0 || M < 0) return 0;
  return mul(fac[M], mul(invfac[N], invfac[M - N]));
}
int h[MAXN], ans[MAXN];
int A[MAXN], B[MAXN], tmp[MAXN];
void solve(int mx) {
  int a = 0, b = 0;
  for (int l = 0, r; l < n && h[l] < mx; l = r + 1) {
    r = l;
    while (r + 1 < n && h[r + 1] == h[r]) ++r;
    if (l == r)
      ++a;
    else
      ++b;
  }
  for (int i = 0; i <= a; ++i) A[i] = mul(binom(a, i), pw2[i]);
  for (int i = 0; i <= 2 * b; ++i) B[i] = binom(2 * b, i);
  NTT(A, B, tmp, a + 1, 2 * b + 1);
  int len = a + 2 * b + 1;
  for (int i = 0; i < len; ++i) ans[i + 1 + mx] = add(ans[i + 1 + mx], tmp[i]);
}
int main() {
  n = read(), k = read();
  init();
  for (int i = 0; i < n; ++i) h[i] = read();
  sort(h, h + n);
  for (int i = 0; i < k; ++i) {
    int x = read();
    solve(x);
  }
  int q = read();
  while (q--) printf("%d\n", ans[read() >> 1]);
  return 0;
}
