#include <bits/stdc++.h>
using namespace std;
const int maxn = 300050;
const long long MOD = 998244353;
long long Pow(long long x, long long n) {
  long long ans = 1, base = x % MOD;
  while (n) {
    if (n & 1) ans = ans * base % MOD;
    base = base * base % MOD;
    n >>= 1;
  }
  return ans;
}
vector<int> idx;
void fft(vector<int> &a, int n, int op) {
  if ((int)idx.size() != n) {
    idx.assign(n, 0);
    for (int i = 0; i < n; ++i)
      idx[i] = (idx[i >> 1] >> 1) | (n >> 1) * (i & 1);
  }
  for (int i = 0; i < n; ++i)
    if (i < idx[i]) swap(a[i], a[idx[i]]);
  for (int l = 2; l <= n; l <<= 1) {
    long long wn = Pow(3ll, (MOD - 1) / l);
    if (op == -1) wn = Pow(wn, MOD - 2);
    for (int i = 0; i < n; i += l) {
      long long w = 1;
      for (int k = i; k < i + (l >> 1); ++k) {
        long long u = a[k], v = a[k + l / 2];
        a[k] = (u + v * w) % MOD;
        a[k + l / 2] = (u - v * w) % MOD;
        w = w * wn % MOD;
      }
    }
  }
  if (op == -1) {
    long long t = Pow(n, MOD - 2);
    for (int i = 0; i < n; ++i) a[i] = (long long)a[i] * t % MOD;
  }
}
template <typename T>
ostream &operator<<(ostream &out, vector<T> &arr) {
  for (auto it = arr.begin(); it != arr.end(); it++) {
    cout << *it << ' ';
  }
  return out;
}
void mul(vector<int> &a, vector<int> &b) {
  int n = 1;
  while (n <= int(a.size() + b.size()) - 2) n <<= 1;
  a.resize(n), b.resize(n);
  fft(a, n, 1), fft(b, n, 1);
  for (int i = 0; i < n; ++i) a[i] = (long long)a[i] * b[i] % MOD;
  fft(a, n, -1);
}
int cnt[maxn];
long long bin[maxn], fact[maxn], inv[maxn];
void init(int n) {
  bin[0] = fact[0] = inv[0] = 1;
  for (int i = 1; i <= n; ++i)
    bin[i] = bin[i - 1] * 2 % MOD, fact[i] = fact[i - 1] * i % MOD;
  inv[n] = Pow(fact[n], MOD - 2);
  for (int i = n - 1; i >= 0; --i) inv[i] = inv[i + 1] * (i + 1) % MOD;
}
long long C(int n, int k) {
  if (k > n) return 0;
  return fact[n] * inv[k] % MOD * inv[n - k] % MOD;
}
long long ans[maxn * 2];
int main() {
  int n, k;
  scanf("%d%d", &n, &k);
  init(n);
  int m = 0;
  for (int i = 0; i < n; ++i) {
    int x;
    scanf("%d", &x);
    cnt[x]++;
    m = max(m, x);
  }
  for (int i = 0; i < k; ++i) {
    int b;
    scanf("%d", &b);
    int n1 = 0, n2 = 0;
    for (int i = 1; i <= min(m, b - 1); ++i) {
      if (cnt[i] == 1)
        ++n1;
      else if (cnt[i] >= 2)
        ++n2;
    }
    vector<int> A(n1 + 2), B(n2 + 1);
    for (int i = 1; i <= n1 + 1; ++i) A[i] = C(n1, i - 1) * bin[i - 1] % MOD;
    for (int i = 0; i <= n2; ++i) B[i] = C(n2, i);
    int N = 1;
    while (N <= int(A.size() + B.size() + B.size()) - 3) N <<= 1;
    A.resize(N), B.resize(N);
    fft(A, N, 1), fft(B, N, 1);
    for (int i = 0; i < N; ++i)
      A[i] = (long long)A[i] * B[i] % MOD * B[i] % MOD;
    fft(A, N, -1);
    for (int i = 0; i < N && i <= n + 1; ++i)
      ans[i + b] = (ans[i + b] + A[i]) % MOD;
  }
  int q;
  scanf("%d", &q);
  for (int i = 0; i < q; ++i) {
    int s;
    scanf("%d", &s);
    s /= 2;
    printf("%lld\n", (ans[s] + MOD) % MOD);
  }
  return 0;
}
