#include <bits/stdc++.h>
using namespace std;
std::mt19937 rnd(
    (int)std::chrono::steady_clock::now().time_since_epoch().count());
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
const int MOD = 998244353;
const int PRIMROOT = 3;
void mlt(int& a, int b) { a = (long long)a * b % MOD; }
int pw(int x, int n) {
  int ret = 1;
  while (true) {
    if (n & 1) mlt(ret, x);
    if ((n >>= 1) == 0) return ret;
    mlt(x, x);
  }
}
struct NTT {
  void _init(int n, int& nlog, int& g, vector<int>& w) {
    assert((MOD - 1) % n == 0);
    g = pw(PRIMROOT, (MOD - 1) / n);
    nlog = 0;
    while ((1 << nlog) < n) ++nlog;
    if ((1 << nlog) != n) nlog = -1;
    w = vector<int>(n);
    w[0] = 1;
    for (int i = (1); i < (n); ++i) w[i] = (long long)w[i - 1] * g % MOD;
  }
  int fftn, fftnlog;
  int fftg;
  vector<int> fftw;
  void initfft(int n) {
    fftn = n, _init(fftn, fftnlog, fftg, fftw);
    assert(fftnlog != -1);
  }
  void fft(int* a, int n, bool inv) {
    if (n != fftn) initfft(n);
    for (int i = 1, j = n >> 1, k, l = j; i < n; j ^= k, ++i) {
      if (i < j) swap(a[i], a[j]);
      for (k = l; k & j; j ^= k, k >>= 1)
        ;
    }
    int *l, *r, *w;
    if (inv) reverse(fftw.begin() + 1, fftw.end());
    for (int hlen = 1, step = n >> 1; hlen < n; hlen <<= 1, step >>= 1) {
      for (int i = 0; i < n; i += (hlen << 1)) {
        l = a + i, r = l + hlen, w = fftw.data();
        for (int off = (0); off < (hlen); ++off) {
          int v = (long long)(*r) * (*w) % MOD;
          *r = (*l) - v;
          if (*r < 0) *r += MOD;
          *l = (*l) + v;
          if (*l >= MOD) *l -= MOD;
          ++l, ++r, w += step;
        }
      }
    }
    if (inv) reverse(fftw.begin() + 1, fftw.end());
    if (inv) {
      int mlt = pw(n, MOD - 2);
      for (int i = (0); i < (n); ++i) a[i] = (long long)a[i] * mlt % MOD;
    }
  }
  void mult(const int* a, int na, const int* b, int nb, int* c, int nc) {
    int sz = 1;
    while (sz < na + nb - 1) sz *= 2;
    vector<int> A(sz, 0), B(sz, 0);
    for (int i = (0); i < (na); ++i) A[i] = a[i];
    for (int i = (0); i < (nb); ++i) B[i] = b[i];
    fft(A.data(), sz, false);
    fft(B.data(), sz, false);
    for (int i = (0); i < (sz); ++i) A[i] = (long long)A[i] * B[i] % MOD;
    fft(A.data(), sz, true);
    for (int i = (0); i < (nc); ++i) c[i] = i < sz ? A[i] : 0;
  }
};
NTT ntt;
const int MAXN = 200000;
const int MAXQ = 200000;
const int MAXX = 200000;
const int MAXQVAL = 1000000;
int n, x, y;
int a[MAXN + 1];
int nq;
int q[MAXQ], qans[MAXQ];
int A[MAXX + 1];
int B[MAXX + 1];
int C[2 * MAXX + 1];
int best[MAXQVAL + 1];
void mult(int* a, int na, int* b, int nb, int* c, int nc) {
  ntt.mult(a, na, b, nb, c, nc);
}
void solve() {
  for (int i = (0); i <= (x); ++i) A[i] = B[i] = 0;
  for (int i = (0); i <= (n); ++i) A[a[i]] = B[x - a[i]] = 1;
  mult(A, x + 1, B, x + 1, C, 2 * x + 1);
  for (int i = (0); i <= (MAXQVAL); ++i) best[i] = -1;
  for (int i = (x + 1); i <= (2 * x); ++i)
    if (C[i] != 0) {
      int z = 2 * (i - x) + 2 * y;
      if (z <= MAXQVAL) best[z] = z;
    }
  for (int i = MAXQVAL; i >= 0; --i)
    if (best[i] != -1)
      for (int j = i + i; j <= MAXQVAL; j += i)
        if (best[j] == -1) best[j] = best[i];
  for (int i = (0); i < (nq); ++i) qans[i] = best[q[i]];
}
void run() {
  scanf("%d%d%d", &n, &x, &y);
  for (int i = (0); i <= (n); ++i) scanf("%d", &a[i]);
  scanf("%d", &nq);
  for (int i = (0); i < (nq); ++i) scanf("%d", &q[i]);
  solve();
  for (int i = (0); i < (nq); ++i) {
    if (i != 0) printf(" ");
    printf("%d", qans[i]);
  }
  puts("");
}
int main() {
  run();
  return 0;
}
