#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();   }