#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
istream &operator>>(istream &in, pair<T1, T2> &a) {
  in >> a.first >> a.second;
  return in;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &out, pair<T1, T2> a) {
  out << a.first << " " << a.second;
  return out;
}
template <typename T, typename T1>
T maxs(T &a, T1 b) {
  if (b > a) a = b;
  return a;
}
template <typename T, typename T1>
T mins(T &a, T1 b) {
  if (b < a) a = b;
  return a;
}
long long xymodp(long long first, long long second, long long p) {
  if (second == 0) return (first != 0);
  long long a = 1;
  first %= p;
  while (second) {
    if (second & 1) a = (a * first) % p;
    first = (first * first) % p;
    second /= 2;
  }
  return a;
}
const long long hell = 998244353;
const long long root = 565042129;
const long long root_1 = 950391366;
const long long root_pw = 1 << 20;
vector<long long> st1(1 << 20), st2(1 << 20), st3(1 << 20, 1), mp(1 << 20);
struct NTT {
  void fft(vector<long long> &a, bool invert) {
    long long i, j, n = (long long)a.size();
    for (i = 1, j = 0; i < n; ++i) {
      long long bit = n >> 1;
      for (; j >= bit; bit >>= 1) {
        j -= bit;
      }
      j += bit;
      if (i < j) swap(a[i], a[j]);
    }
    for (long long len = 2; len <= n; len <<= 1) {
      long long wlen = invert ? root_1 : root;
      for (i = len; i < root_pw; i <<= 1) {
        wlen = (wlen * wlen % hell);
      }
      for (i = 0; i < n; i += len) {
        long long w = 1;
        for (j = 0; j < len / 2; ++j) {
          long long u = a[i + j],
                    v = (long long)(a[i + j + len / 2] * w % hell);
          a[i + j] = (u + v + hell) % hell;
          a[i + j + len / 2] = (u - v + hell) % hell;
          w = (w * wlen % hell);
        }
      }
    }
    if (invert) {
      long long nrev = xymodp(n, hell - 2, hell);
      for (i = 0; i < n; ++i) {
        a[i] = (a[i] * nrev % hell);
      }
    }
  }
  void multiply(const vector<long long> &a, const vector<long long> &b,
                vector<long long> &res) {
    vector<long long> fa(a.begin(), a.end()), fb(b.begin(), b.end());
    size_t n = 1;
    while (n < max(a.size(), b.size())) n <<= 1;
    n <<= 1;
    fa.resize(n), fb.resize(n);
    fft(fa, false), fft(fb, false);
    for (size_t i = 0; i < n; ++i) {
      fa[i] *= fb[i];
    }
    fft(fa, true);
    res.resize(n);
    for (size_t i = 0; i < n; ++i) {
      res[i] = fa[i];
    }
  }
  void polyexpo(vector<long long> &a, vector<long long> &st1,
                vector<long long> &st2, long long n1, long long n2) {
    long long s = (long long)a.size();
    for (long long i = 0; i < s; i++)
      a[i] = xymodp(st1[i], n1, hell) * xymodp(st2[i], n2, hell) % hell;
    fft(a, 1);
  }
} ntt;
vector<long long> poly[6];
void func(long long f1, long long f2, long long i) {
  poly[i].resize(1 << 20);
  if (f1 && f2)
    ntt.polyexpo(poly[i], st1, st2, f1, 2 * f2);
  else if (f1)
    ntt.polyexpo(poly[i], st1, st3, f1, 1);
  else if (f2)
    ntt.polyexpo(poly[i], st3, st2, 1, 2 * f2);
  else
    ntt.polyexpo(poly[i], st3, st3, 1, 1);
}
void make() {
  st1[0] = st1[1] = 1;
  st1[1]++;
  st2[0] = st2[1] = 1;
  ntt.fft(st1, 0);
  ntt.fft(st2, 0);
}
long long solve() {
  long long n, k;
  cin >> n >> k;
  vector<long long> a(n + 1), b(k + 1);
  for (long long i = 1; i < n + 1; i++) cin >> a[i];
  for (long long i = 1; i < k + 1; i++) cin >> b[i];
  sort(a.begin(), a.end());
  sort(b.begin(), b.end());
  long long j = 1;
  long long f1 = 0, f2 = 0;
  for (long long i = 1; i <= k; i++) {
    for (j; j <= n; j++) {
      if (a[j] >= b[i]) break;
      if (mp[a[j]] == 1)
        f2++, f1--;
      else if (mp[a[j]] == 0)
        f1++;
      mp[a[j]]++;
    }
    func(f1, f2, i);
  }
  long long q;
  cin >> q;
  for (long long i = 0; i < q; i++) {
    long long p;
    cin >> p;
    long long ans = 0;
    for (long long i = 1; i <= k; i++) {
      long long val = p - 2 * b[i] - 2;
      if (val < 0) continue;
      ans = (ans + poly[i][val / 2]) % hell;
    }
    cout << ans << "\n";
  }
  return 0;
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long t = 1;
  make();
  while (t--) {
    solve();
  }
  return 0;
}
