#include <bits/stdc++.h>
using namespace std;
const int MAXN = 3e5 + 5;
const int MAXM = 1.2e6;
const long long mod = 998244353;
const int root = 3;
template <typename T>
inline void read(T &x) {
  x = 0;
  char temp = getchar();
  bool f = false;
  while (!isdigit(temp)) {
    if (temp == '-') f = true;
    temp = getchar();
  }
  while (isdigit(temp)) {
    x = (x << 1) + (x << 3) + temp - '0';
    temp = getchar();
  }
  if (f) x = -x;
}
template <typename T>
void print(T x) {
  if (x < 0) putchar('-'), x = -x;
  if (x > 9) print(x / 10);
  putchar(x % 10 + '0');
}
inline long long ksm(long long base, long long b) {
  long long res = 1;
  while (b) {
    if (b & 1) res = res * base % mod;
    base = base * base % mod, b >>= 1;
  }
  return res;
}
int n, k, m;
int cnt[MAXN], red;
long long x[MAXN << 2], y[MAXN << 2], ans[MAXM];
long long fac[MAXN], ifac[MAXN];
inline void GetC() {
  fac[0] = 1;
  for (register int i = 1; i <= n; i++) fac[i] = fac[i - 1] * i % mod;
  ifac[n] = ksm(fac[n], mod - 2);
  for (register int i = n - 1; i >= 0; i--)
    ifac[i] = ifac[i + 1] * (i + 1) % mod;
}
inline long long C(long long x, long long y) {
  if (y > x) return 0;
  return fac[x] * ifac[y] % mod * ifac[x - y] % mod;
}
int rev[MAXN << 2];
inline int Prework(int len) {
  int lim = 1, bit = 0;
  while (lim < len) lim <<= 1, bit++;
  for (register int i = 0; i < lim; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (bit - 1));
  return lim;
}
inline void NTT(long long *a, int lim, int inv) {
  for (register int i = 0; i < lim; i++)
    if (rev[i] < i) swap(a[i], a[rev[i]]);
  for (register int len = 1; len < lim; len <<= 1) {
    long long I = ksm(root, (mod - 1) - inv * (mod - 1) / (len << 1));
    for (register int i = 0; i < lim; i += len << 1) {
      long long w = 1;
      for (register int j = 0; j < len; j++, w = w * I % mod) {
        long long X = a[i + j], Y = a[i + j + len] * w % mod;
        a[i + j] = X + Y >= mod ? X + Y - mod : X + Y;
        a[i + j + len] = X - Y < 0 ? X - Y + mod : X - Y;
      }
    }
  }
  if (inv == -1) {
    long long temp = ksm(lim, mod - 2);
    for (register int i = 0; i < lim; i++) a[i] = a[i] * temp % mod;
  }
}
inline void Init() { memset(x, 0, sizeof(x)), memset(y, 0, sizeof(y)); }
signed main() {
  read(n), read(k);
  for (register int i = 1, temp; i <= n; i++) read(temp), cnt[temp]++;
  GetC();
  while (k--) {
    Init();
    read(red);
    int a = 0, b = 0;
    for (register int i = 0; i < red; i++)
      if (cnt[i] == 1)
        a++;
      else if (cnt[i] >= 2)
        b += 2;
    for (register int i = 0; i <= a; i++) x[i] = C(a, i) * ksm(2, i) % mod;
    for (register int i = 0; i <= b; i++) y[i] = C(b, i);
    int lim = Prework(a + b + 2);
    NTT(x, lim, 1), NTT(y, lim, 1);
    for (register int i = 0; i < lim; i++) x[i] = x[i] * y[i] % mod;
    NTT(x, lim, -1);
    for (register int i = 0; i < lim; i++)
      ans[i + 1 + red] = (ans[i + 1 + red] + x[i]) % mod;
  }
  read(m);
  while (m--) {
    int q;
    read(q);
    print(ans[q / 2]), puts("");
  }
  return 0;
}
