#include <bits/stdc++.h>
using namespace std;
int const md = 998244353, R = 810127274, RI = 447056889, P2 = 1 << 23;
inline int pw(int x, int p) {
  int an = 1;
  while (p) {
    if (p & 1) an = (long long)an * x % md;
    x = (long long)x * x % md;
    p >>= 1;
  }
  return an;
}
int mul(int a, int b) { return (1ll * a * b) % md; }
int adl(int a, int b) { return (a + b) % md; }
void ntt(vector<int> &v, bool inv = false) {
  int n = v.size(), j = 0;
  for (int i = 1; i < n; ++i) {
    int z = n >> 1;
    while (j & z) j ^= z, z >>= 1;
    j ^= z;
    if (i < j) swap(v[i], v[j]);
  }
  for (int m = 1; m < n; m <<= 1) {
    int s = inv ? RI : R;
    for (int i = m << 1; i < P2; i <<= 1) s = (long long)s * s % md;
    for (int i = 0; i < n; i += m << 1) {
      int w = 1;
      for (int k = 0; k < m; ++k) {
        int a = v[i + k], b = (long long)w * v[i + k + m] % md;
        v[i + k] = a + b >= md ? a + b - md : a + b;
        v[i + k + m] = a - b < 0 ? a - b + md : a - b;
        w = (long long)w * s % md;
      }
    }
  }
  if (inv) {
    int t = pw(n, md - 2);
    for (int i = 0; i < n; ++i) v[i] = (long long)v[i] * t % md;
  }
}
vector<int> ml(vector<int> const &a, vector<int> const &b) {
  vector<int> v1(a.begin(), a.end()), v2(b.begin(), b.end());
  int mxn = max(a.size(), b.size()), n = 1;
  while (n < mxn) n <<= 1;
  n <<= 1;
  v1.resize(n), v2.resize(n);
  ntt(v1), ntt(v2);
  for (int i = 0; i < n; ++i) v1[i] = (long long)v1[i] * v2[i] % md;
  ntt(v1, true);
  v1.resize(a.size() + b.size() - 1);
  return v1;
}
vector<int> pre[5];
const int N = 300000;
int fc[N + 1], inv[N + 1], n, k, a[N], b[N], q, freq[N];
int nck(int n, int k) { return mul(fc[n], mul(inv[k], inv[n - k])); }
int main() {
  fc[0] = 1;
  inv[0] = pw(fc[0], md - 2);
  for (int i = 1; i <= N; ++i) {
    fc[i] = mul(i, fc[i - 1]);
    inv[i] = pw(fc[i], md - 2);
  }
  cin >> n >> k;
  for (int i = 0; i < n; ++i) {
    scanf("%d", a + i);
    freq[a[i]]++;
  }
  for (int i = 0; i < k; ++i) scanf("%d", b + i);
  sort(b, b + k);
  for (int p = 0; p < k; ++p) {
    int ds = 0, nds = 0;
    for (int i = 1; i < b[p]; ++i) {
      ds += (freq[i] == 1);
      nds += (freq[i] > 1);
    }
    vector<int> dsv;
    for (int i = 0; i <= ds; ++i) {
      dsv.push_back(mul(pw(2, i), nck(ds, i)));
    }
    vector<int> ndsv;
    for (int i = 0; i <= 2 * nds; ++i) {
      ndsv.push_back(nck(2 * nds, i));
    }
    pre[p] = ml(ndsv, dsv);
  }
  cin >> q;
  for (int cur, i = 0; i < q; ++i) {
    scanf("%d", &cur);
    long long fn = 0;
    for (int j = 0; j < k; ++j) {
      if (2 * b[j] + 2 <= cur) {
        int rem = (cur - (2 * b[j] + 2)) / 2;
        if (rem < pre[j].size()) {
          fn = adl(fn, pre[j][rem]);
        }
      }
    }
    printf("%lld\n", fn);
  }
  return 0;
}
