#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long gans = 0, gflag = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    gflag |= (ch == '-');
    ch = getchar();
  }
  while ('0' <= ch && ch <= '9') {
    gans = (gans << 1) + (gans << 3) + ch - '0';
    ch = getchar();
  }
  return gflag ? -gans : gans;
}
inline void write(long long x) {
  if (x > 9) {
    write(x / 10);
  }
  putchar(x % 10 ^ 48);
}
inline void writenum(long long x, char ch) {
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  write(x);
  putchar(ch);
}
inline void writechar(char x, char ch) {
  putchar(x);
  putchar(ch);
}
inline long long Min(long long x, long long y) { return x < y ? x : y; }
inline long long Max(long long x, long long y) { return x > y ? x : y; }
const long long Mx = 1e6 + 2e5;
const long long MOD = 998244353;
const long long INV2 = (MOD + 1) >> 1;
const long long G = 3;
inline long long KSM(long long x, long long y) {
  long long nm = 1;
  for (; y; y >>= 1) {
    if (y & 1) {
      nm = (((long long)(nm) * (x)) % MOD);
    }
    x = (((long long)(x) * (x)) % MOD);
  }
  return nm;
}
inline long long INV(long long x) { return KSM(x, MOD - 2); }
const long long _G = INV(G);
long long n, m, A[Mx + 5], B[Mx + 5], R[Mx + 5], S[Mx + 5], Fac[Mx + 5],
    _Inv[Mx + 5], ans[Mx + 5];
inline long long Get(long long x) {
  long long i, k = ceil(log2(x));
  x = 1 << k;
  for (i = 0; i < x; i++) {
    R[i] = R[i >> 1] >> 1 | ((i & 1) << (k - 1));
  }
  return x;
}
inline void NTT(long long *a, long long len, long long fl) {
  long long i, j, k, x, y, nm, inv;
  for (i = 0; i < len; i++) {
    if (i < R[i]) {
      swap(a[i], a[R[i]]);
    }
  }
  for (i = 1; i < len; i <<= 1) {
    nm = KSM(G, fl * (MOD - 1) / (i << 1) + (MOD - 1));
    S[0] = 1;
    for (j = 1; j < i; j++) {
      S[j] = (((long long)(S[j - 1]) * (nm)) % MOD);
    }
    for (j = 0; j < len; j += (i << 1)) {
      for (k = 0; k < i; k++) {
        x = a[j + k];
        y = (((long long)(a[i + j + k]) * (S[k])) % MOD);
        a[j + k] = ((x + y) % MOD);
        a[i + j + k] = ((x - y + MOD) % MOD);
      }
    }
  }
  if (fl == -1) {
    inv = INV(len);
    for (i = 0; i < len; i++) {
      a[i] = (((long long)(a[i]) * (inv)) % MOD);
    }
  }
}
inline void Pre() {
  long long i;
  for (i = 1, Fac[0] = 1; i <= n; i++) {
    Fac[i] = (((long long)(Fac[i - 1]) * (i)) % MOD);
  }
  for (i = n - 1, _Inv[n] = INV(Fac[n]); ~i; i--) {
    _Inv[i] = (((long long)(_Inv[i + 1]) * (i + 1)) % MOD);
  }
}
inline long long C(long long x, long long y) {
  return (
      ((long long)(Fac[x]) * ((((long long)(_Inv[y]) * (_Inv[x - y])) % MOD))) %
      MOD);
}
long long len, H[Mx + 5];
signed main() {
  long long i, h, tt1, tt2;
  n = read();
  m = read();
  Pre();
  for (i = 1; i <= n; i++) {
    H[read()]++;
  }
  while (m--) {
    tt1 = tt2 = 0;
    h = read();
    for (i = 1; i < h; i++) {
      if (H[i] == 1) {
        tt1++;
      }
      if (H[i] > 1) {
        tt2++;
      }
    }
    for (i = 0; i <= tt1; i++) {
      A[i] = (((long long)(C(tt1, i)) * (KSM(2, i))) % MOD);
    }
    for (i = 0; i <= tt2 * 2; i++) {
      B[i] = C(tt2 * 2, i);
    }
    len = Get(tt1 + tt2 * 2 + 1);
    NTT(A, len, 1);
    NTT(B, len, 1);
    for (i = 0; i < len; i++) {
      A[i] = (((long long)(A[i]) * (B[i])) % MOD);
      B[i] = 0;
    }
    NTT(A, len, -1);
    for (i = 0; i <= tt1 + tt2 * 2; i++) {
      ans[i + h + 1] = ((ans[i + h + 1] + A[i]) % MOD);
    }
    for (i = 0; i < len; i++) {
      A[i] = 0;
    }
  }
  m = read();
  while (m--) {
    writenum(ans[read() / 2], '\n');
  }
  return 0;
}
