#include <bits/stdc++.h>
using namespace std;
const int mod = 998244353;
template <int mod = mod>
struct Modular {
  int val;
  Modular() { val = 0; }
  Modular(long long _val) { val = Normalize(_val); }
  Modular(int _val) { val = Normalize(_val); }
  inline int Normalize(long long& _val) {
    if (_val < 0) _val = _val % mod + mod;
    if (_val >= mod) _val %= mod;
    return _val;
  }
  inline int Normalize(int& _val) {
    if (_val < 0) _val = _val % mod + mod;
    if (_val >= mod) _val %= mod;
    return _val;
  }
  inline Modular modinv(int a, int m = mod) {
    int u = 0, v = 1;
    while (a != 0) {
      int t = m / a;
      m -= t * a;
      swap(a, m);
      u -= t * v;
      swap(u, v);
    }
    assert(m == 1);
    return u;
  }
  inline Modular modinv() { return modinv(val); }
  inline Modular modpow(long long p) const {
    assert(p >= 0);
    Modular a = *this, result = 1;
    while (p > 0) {
      if (p & 1) result *= a;
      a *= a;
      p >>= 1;
    }
    return result;
  }
  static unsigned Fastmod(uint64_t x, unsigned m = mod) {
    return x % m;
    unsigned xhi = x >> 32, xlo = (unsigned)x;
    unsigned q, r;
    asm("divl %4\n" : "=a"(q), "=d"(r) : "d"(xhi), "a"(xlo), "r"(m));
    return r;
  }
  inline Modular& operator+=(const Modular& other) {
    val += other.val;
    if (val >= mod) val -= mod;
    return *this;
  }
  inline Modular& operator-=(const Modular& other) {
    val -= other.val;
    if (val < 0) val += mod;
    return *this;
  }
  inline Modular& operator%=(const Modular& other) {
    val %= other.val;
    return *this;
  }
  inline Modular& operator*=(const Modular& other) {
    val = Fastmod((uint64_t)val * other.val);
    return *this;
  }
  inline Modular& operator/=(const Modular& other) {
    return *this *= modinv(other.val);
  }
  inline friend Modular operator+(const Modular& a, const Modular& b) {
    return Modular(a) += b;
  }
  inline friend Modular operator-(const Modular& a, const Modular& b) {
    return Modular(a) -= b;
  }
  inline friend Modular operator%(const Modular& a, const Modular& b) {
    return Modular(a) %= b;
  }
  inline friend Modular operator*(const Modular& a, const Modular& b) {
    return Modular(a) *= b;
  }
  inline friend Modular operator/(const Modular& a, const Modular& b) {
    return Modular(a) /= b;
  }
  inline friend istream& operator>>(istream& stream, Modular& m) {
    long long x;
    stream >> x;
    m.val = m.Normalize(x);
    return stream;
  }
  inline friend ostream& operator<<(ostream& stream, const Modular& m) {
    return stream << m.val;
  }
  inline Modular operator++() { return *this += 1; }
  inline Modular operator--() { return *this -= 1; }
  inline Modular operator++(int) {
    Modular x = *this;
    ++*this;
    return x;
  }
  inline Modular operator--(int) {
    Modular x = *this;
    --*this;
    return x;
  }
  inline Modular operator-() const { return Modular(-val); }
  inline friend bool operator==(const Modular& a, const Modular& b) {
    return a.val == b.val;
  }
  inline friend bool operator!=(const Modular& a, const Modular& b) {
    return a.val != b.val;
  }
  inline friend bool operator>(const Modular& a, const Modular& b) {
    return a.val > b.val;
  }
  inline friend bool operator<(const Modular& a, const Modular& b) {
    return a.val < b.val;
  }
  inline friend bool operator>=(const Modular& a, const Modular& b) {
    return a.val >= b.val;
  }
  inline friend bool operator<=(const Modular& a, const Modular& b) {
    return a.val <= b.val;
  }
};
const int G = 3;
const int N = 1 << 20;
Modular<mod> root[1 << 20];
Modular<mod> _pow2[(1 << 20) + 1];
struct ntt {
  ntt() {
    root[N / 2] = 1;
    root[N / 2 + 1] = ((Modular<mod>)G).modpow((mod - 1) / N);
    for (int i = N / 2 + 2; i < N; ++i) root[i] = root[i - 1] * root[N / 2 + 1];
    for (int i = N / 2; --i;) root[i] = root[2 * i];
    for (int i = 0; i <= 20; i++)
      _pow2[1 << i] = ((Modular<mod>)(1 << i)).modinv();
  }
  vector<Modular<mod> > Convolute(vector<Modular<mod> >& a,
                                  vector<Modular<mod> >& b) {
    int s = a.size() + b.size() - 1, n = 1;
    while (n < s) n *= 2;
    vector<Modular<mod> > c(n);
    a.resize(n);
    NTT(a);
    b.resize(n);
    NTT(b);
    for (int i = 0; i < n; i++) c[i] = a[i] * b[i] * _pow2[n];
    reverse(c.begin() + 1, c.end());
    NTT(c);
    c.resize(s);
    return c;
  }
  void NTT(vector<Modular<mod> >& a) {
    int n = a.size();
    for (int i = 0, j = 0; i < n; ++i) {
      if (i > j) swap(a[i], a[j]);
      for (int k = n / 2; (j ^= k) < k; k /= 2)
        ;
    }
    for (int k = 1; k < n; k *= 2) {
      for (int i = 0; i < n; i += 2 * k) {
        for (int j = 0; j < k; j++) {
          Modular<mod> z = root[j + k] * a[i + j + k], &ai = a[i + j];
          a[i + j + k] = ai - z;
          ai += z;
        }
      }
    }
  }
} NTT;
void solve() {
  int n, x, y;
  cin >> n >> x >> y;
  vector<Modular<mod> > a(x + 1);
  for (int i = 0; i <= n; ++i) {
    int var;
    cin >> var;
    a[var] = 1;
  }
  vector<Modular<mod> > b = a;
  reverse(begin(b), end(b));
  b = NTT.Convolute(a, b);
  vector<int> c(1e6 + 1);
  for (int i = 0; i < int(b.size()); ++i) {
    if (b[i] == 0 || !(abs(x - i))) continue;
    int idx = 2 * (y + abs(x - i));
    if (idx <= 1e6) c[idx] = 1;
  }
  vector<int> dp(1e6 + 1);
  for (int i = 2; i <= 1e6; ++i) {
    if (!c[i]) continue;
    for (int j = i; j <= 1e6; j += i) {
      dp[j] = max(dp[j], i);
    }
  }
  int q;
  cin >> q;
  while (q--) {
    int l;
    cin >> l;
    if (dp[l]) {
      cout << dp[l] << " ";
      continue;
    }
    cout << -1 << " ";
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int t;
  t = 1;
  while (t--) solve();
}
