#include <bits/stdc++.h>   using namespace std;   const int MAXN = 1 << 20;   const long long MOD = 2305843009255636993, RT = 5;   struct CD {     double r, i;     CD(double r = 0, double i = 0) : r(r), i(i) {}     double real() const { return r; }     void operator/=(const int c) { r /= c, i /= c; }   };   CD operator*(const CD& a, const CD& b) {     return CD(a.r * b.r - a.i * b.i, a.r * b.i + a.i * b.r);   }   CD operator+(const CD& a, const CD& b) { return CD(a.r + b.r, a.i + b.i); }   CD operator-(const CD& a, const CD& b) { return CD(a.r - b.r, a.i - b.i); }   const double pi = acos(-1.0);   CD cp1[MAXN + 9], cp2[MAXN + 9];   int R[MAXN + 9];   void dft(CD* a, int n, bool inv) {     for (int i = 0, ThxDem = n; i < ThxDem; ++i)       if (R[i] < i) swap(a[R[i]], a[i]);     for (int m = 2; m <= n; m *= 2) {       double z = 2 * pi / m * (inv ? -1 : 1);       CD wi = CD(cos(z), sin(z));       for (int j = 0; j < n; j += m) {         CD w(1);         for (int k = j, k2 = j + m / 2; k2 < j + m; k++, k2++) {           CD u = a[k];           CD v = a[k2] * w;           a[k] = u + v;           a[k2] = u - v;           w = w * wi;         }       }     }     if (inv)       for (int i = 0, ThxDem = n; i < ThxDem; ++i) a[i] /= n;   }   vector<long long> multiply(vector<long long>& p1, vector<long long>& p2) {     int n = p1.size() + p2.size() + 1;     int m = 1, cnt = 0;     while (m <= n) m += m, cnt++;     for (int i = 0, ThxDem = m; i < ThxDem; ++i) {       R[i] = 0;       for (int j = 0, ThxDem = cnt; j < ThxDem; ++j)         R[i] = (R[i] << 1) | ((i >> j) & 1);     }     for (int i = 0, ThxDem = m; i < ThxDem; ++i) cp1[i] = 0, cp2[i] = 0;     for (int i = 0, ThxDem = p1.size(); i < ThxDem; ++i) cp1[i] = p1[i];     for (int i = 0, ThxDem = p2.size(); i < ThxDem; ++i) cp2[i] = p2[i];     dft(cp1, m, false);     dft(cp2, m, false);     for (int i = 0, ThxDem = m; i < ThxDem; ++i) cp1[i] = cp1[i] * cp2[i];     dft(cp1, m, true);     vector<long long> res;     n -= 2;     for (int i = 0, ThxDem = n; i < ThxDem; ++i)       res.push_back((long long)floor(cp1[i].real() + 0.5));     return res;   }   int spf[MAXN];   vector<int> ds;   vector<pair<int, int> > prs;   void gen(int x, int pos) {     if (pos == int(prs.size()))       ds.push_back(x);     else {       for (int i = 0, ThxDem = prs[pos].second + 1; i < ThxDem; ++i) {         if (i || prs[pos].first != 2) gen(x, pos + 1);         x *= prs[pos].first;       }     }   }   vector<int> dis[MAXN];   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     for (int i = 2, ThxDem = MAXN; i < ThxDem; ++i)       if (!spf[i])         for (int j = i; j < MAXN; j += i)           if (!spf[j]) spf[j] = i;     for (int i = 2, ThxDem = MAXN; i < ThxDem; ++i)       if (i % 2 == 0) {         prs.clear();         ds.clear();         int x = i;         while (x > 1) {           int now = spf[x], pw = 0;           while (x % now == 0) x /= now, pw++;           prs.push_back({now, pw});         }         gen(1, 0);         sort(ds.begin(), ds.end());         reverse(ds.begin(), ds.end());         dis[i] = ds;       }     int n, x, y;     cin >> n >> x >> y;     n++;     vector<int> a(n);     int off = x + 1;     vector<long long> neg(2 * (x + 1)), pos(2 * (x + 1));     for (int i = 0, ThxDem = n; i < ThxDem; ++i) {       cin >> a[i];       neg[x + 1 - a[i]] = 1;       pos[off + a[i]] = 1;     }     auto ws = multiply(neg, pos);     int q;     cin >> q;     vector<int> ans(q, -1);     for (int j = 0, ThxDem = q; j < ThxDem; ++j) {       int v;       cin >> v;       for (auto tt : dis[v]) {         int len = tt - 2 * y;         if (len <= 0 || len % 2) continue;         len /= 2;         if (2 * off + len < int(ws.size()) && ws[2 * off + len] > 0) {           ans[j] = tt;           break;         }       }     }     for (auto x : ans) cout << x <<    ;     cout <<   n ;   }