#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
long long rand(long long l, long long r) {
  uniform_int_distribution<long long> uid(l, r);
  return uid(rng);
}
const int MAXN = 20;
const int maxn = 1 << MAXN;
const int mod = 998244353;
const int root = 3;
int A[maxn], B[maxn];
int W[maxn], iW[maxn], I[maxn];
int nn;
const int threshold = 10000;
namespace modulo {
const int MOD = 998244353;
int add(const int &a, const int &b) {
  int val = a + b;
  if (val >= MOD) val -= MOD;
  return val;
}
int sub(const int &a, const int &b) {
  int val = a - b;
  if (val < 0) val += MOD;
  return val;
}
int mul(const int &a, const int &b) { return 1ll * a * b % MOD; }
}  // namespace modulo
using namespace modulo;
void ensureINV(int n) {
  if (n <= nn) return;
  if (!nn) {
    I[1] = 1;
    nn = 1;
  }
  for (int i = nn + 1; i <= n; i++) I[i] = (mod - mul((mod / i), I[mod % i]));
  nn = n;
}
int pwr(int a, int b) {
  int ans = 1;
  while (b) {
    if (b & 1) ans = mul(ans, a);
    a = mul(a, a);
    b >>= 1;
  }
  return ans;
}
void precompute() {
  W[0] = iW[0] = 1;
  int g = pwr(root, (mod - 1) / maxn), ig = pwr(g, mod - 2);
  for (int i = 1; i <= maxn / 2 - 1; i++) {
    W[i] = mul(W[i - 1], g);
    iW[i] = mul(iW[i - 1], ig);
  }
}
int rev(int i, int n) {
  int irev = 0;
  n >>= 1;
  while (n) {
    n >>= 1;
    irev = (irev << 1) | (i & 1);
    i >>= 1;
  }
  return irev;
}
void go(int a[], int n) {
  for (int i = 0; i <= n - 1; i++) {
    int r = rev(i, n);
    if (i < r) swap(a[i], a[r]);
  }
}
void fft(int a[], int n, bool inv = 0) {
  go(a, n);
  int len, i, j, *p, *q, u, v, ind, add;
  for (len = 2; len <= n; len <<= 1) {
    for (i = 0; i < n; i += len) {
      ind = 0, add = maxn / len;
      p = &a[i], q = &a[i + len / 2];
      for (int j = 0; j <= len / 2 - 1; j++) {
        v = mul((*q), (inv ? iW[ind] : W[ind]));
        (*q) = sub((*p), v);
        (*p) = ::add((*p), v);
        ind += add;
        p++, q++;
      }
    }
  }
  if (inv) {
    int p = pwr(n, mod - 2);
    for (int i = 0; i <= n - 1; i++) a[i] = mul(a[i], p);
  }
}
vector<int> brute(const vector<int> &a, const vector<int> &b) {
  vector<int> c(a.size() + b.size() - 1, 0);
  for (int i = 0; i < a.size(); i++) {
    for (int j = 0; j < b.size(); j++) {
      c[i + j] = add(c[i + j], mul(a[i], b[j]));
    }
  }
  return c;
}
vector<int> mul(vector<int> a, vector<int> b, int n) {
  if ((long long)a.size() * b.size() <= threshold) return brute(a, b);
  assert((n & (n - 1)) == 0);
  a.resize(n, 0);
  b.resize(n, 0);
  copy(a.begin(), a.end(), A);
  fft(A, n);
  if (a == b)
    copy(A, A + n, B);
  else {
    copy(b.begin(), b.end(), B);
    fft(B, n);
  }
  for (int i = 0; i <= n - 1; i++) A[i] = mul(A[i], B[i]);
  fft(A, n, 1);
  vector<int> c(A, A + n);
  return c;
}
const int N = 3e5 + 5;
int fact[maxn], ifact[maxn];
vector<int> gen1(int c) {
  vector<int> v(c + 1);
  int val = 1;
  for (int i = 0; i <= c; i++) {
    v[i] = ((long long)fact[c] * ifact[i]) % mod;
    v[i] = ((long long)v[i] * ifact[c - i]) % mod;
    v[i] = ((long long)v[i] * val) % mod;
    val <<= 1;
    if (val >= mod) val -= mod;
  }
  return v;
}
vector<int> gen2(int c) {
  c *= 2;
  vector<int> v(c + 1);
  for (int i = 0; i <= c; i++) {
    v[i] = ((long long)fact[c] * ifact[i]) % mod;
    v[i] = ((long long)v[i] * ifact[c - i]) % mod;
  }
  return v;
}
int a[N], b[N];
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  cout.tie(NULL);
  precompute();
  fact[0] = 1;
  for (int i = 1; i <= maxn - 1; i++) {
    fact[i] = ((long long)i * fact[i - 1]) % mod;
  }
  ifact[maxn - 1] = pwr(fact[maxn - 1], mod - 2);
  for (int i = maxn - 2; i >= 0; i--) {
    ifact[i] = ((long long)ifact[i + 1] * (i + 1)) % mod;
  }
  int n, k;
  cin >> n >> k;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  sort(a + 1, a + n + 1);
  for (int i = 1; i <= k; i++) {
    cin >> b[i];
  }
  sort(b + 1, b + k + 1);
  const int M = 7e5 + 5;
  vector<int> v(M, 0);
  int pt = 0, c1 = 0, c2 = 0;
  for (int i = 1; i <= k; i++) {
    while (pt < n) {
      if (a[pt + 1] >= b[i]) break;
      pt++;
      int val = a[pt];
      int c = 0;
      while (pt <= n && a[pt] == val) {
        c++;
        pt++;
      }
      pt--;
      (c == 1) ? c1++ : c2++;
    }
    vector<int> v1 = gen1(c1), v2 = gen2(c2);
    v1 = mul(v1, v2, maxn);
    v1.resize(M - b[i] - 1);
    for (int j = 0; j <= (int)v1.size() - 1; j++) {
      v[j + b[i]] += v1[j];
      if (v[j + b[i]] >= mod) v[j + b[i]] -= mod;
    }
  }
  int q;
  cin >> q;
  while (q--) {
    int x;
    cin >> x;
    x = (x / 2 - 1);
    cout << v[x] << '\n';
  }
  return 0;
}
