#include <bits/stdc++.h>
using namespace std;
inline long long getint() {
  long long _x = 0, _tmp = 1;
  char _tc = getchar();
  while ((_tc < '0' || _tc > '9') && _tc != '-') _tc = getchar();
  if (_tc == '-') _tc = getchar(), _tmp = -1;
  while (_tc >= '0' && _tc <= '9') _x *= 10, _x += (_tc - '0'), _tc = getchar();
  return _x * _tmp;
}
inline long long add(long long _x, long long _y,
                     long long _mod = 1000000007ll) {
  long long _ = _x + _y;
  if (_ >= _mod) _ -= _mod;
  return _;
}
inline long long sub(long long _x, long long _y,
                     long long _mod = 1000000007ll) {
  long long _ = _x - _y;
  if (_ < 0) _ += _mod;
  return _;
}
inline long long mul(long long _x, long long _y,
                     long long _mod = 1000000007ll) {
  long long _ = _x * _y;
  if (_ >= _mod) _ %= _mod;
  return _;
}
long long mypow(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 1ll;
  long long _tmp = mypow(_a, _x / 2, _mod);
  _tmp = mul(_tmp, _tmp, _mod);
  if (_x & 1) _tmp = mul(_tmp, _a, _mod);
  return _tmp;
}
long long mymul(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 0ll;
  long long _tmp = mymul(_a, _x / 2, _mod);
  _tmp = add(_tmp, _tmp, _mod);
  if (_x & 1) _tmp = add(_tmp, _a, _mod);
  return _tmp;
}
inline bool equal(double _x, double _y) {
  return _x > _y - 1e-9 && _x < _y + 1e-9;
}
int __ = 1, _cs;
long long n, G, R, d[101010], t[101010], GR, s[101010];
void build() {}
struct Nd {
  Nd *l, *r;
  int mn;
  Nd() {
    l = r = NULL;
    mn = 101010;
  }
} * root;
void modify(Nd* now, int l, int r, int p, int x) {
  now->mn = x;
  if (l == r) return;
  if (p <= ((l + r) >> 1)) {
    if (!now->l) now->l = new Nd();
    modify(now->l, l, ((l + r) >> 1), p, x);
  } else {
    if (!now->r) now->r = new Nd();
    modify(now->r, ((l + r) >> 1) + 1, r, p, x);
  }
}
int query(Nd* now, int l, int r, int ql, int qr) {
  if (!now || qr < l || r < ql) return 101010;
  if (ql <= l && r <= qr) return now->mn;
  return min(query(now->l, l, ((l + r) >> 1), ql, qr),
             query(now->r, ((l + r) >> 1) + 1, r, ql, qr));
}
int query(int lpos, int rpos) {
  if (lpos <= rpos) return query(root, 0, GR - 1, lpos, rpos);
  return min(query(root, 0, GR - 1, 0, rpos),
             query(root, 0, GR - 1, lpos, GR - 1));
}
void pre_solve() {
  root = new Nd();
  for (int i = n; i >= 0; i--) {
    int lpos = ((G - s[i]) % GR + GR) % GR;
    int rpos = ((GR - 1 - s[i]) % GR + GR) % GR;
    int bst = query(lpos, rpos);
    if (bst == 101010)
      t[i] = s[i];
    else {
      t[i] = s[i] - s[bst] + t[bst];
      t[i] += GR - (s[i] - s[bst]) % GR;
    }
    if (i) modify(root, 0, GR - 1, ((-s[i]) % GR + GR) % GR, i);
  }
}
inline long long cal(long long ti) {
  int lpos = ((G - s[0] - ti) % GR + GR) % GR;
  int rpos = ((GR - 1 - s[0] - ti) % GR + GR) % GR;
  int bst = query(lpos, rpos);
  if (bst == 101010) return ti + s[0];
  long long ans = ti + s[0] - s[bst] + t[bst];
  ans += GR - (ti + s[0] - s[bst]) % GR;
  return ans;
}
void init() {
  n = getint();
  G = getint();
  R = getint();
  GR = G + R;
  for (int i = 0; i <= n; i++) d[i] = getint();
  for (int i = n; i >= 0; i--) s[i] = s[i + 1] + d[i];
}
void solve() {
  pre_solve();
  int q = getint();
  while (q--) {
    long long ti = getint();
    printf("%lld\n", cal(ti));
  }
}
int main() {
  build();
  while (__--) {
    init();
    solve();
  }
}
