#include <bits/stdc++.h>
using namespace std;
struct Event {
  long long fromBegin, toBegin;
  bool isPoint;
};
struct List {
  int x;
  long long left, right;
};
const int INF = 0x3f3f3f3f;
const long long LINF = 0x3f3f3f3f3f3f3f3fLL;
vector<List> tree;
int curk;
int n;
long long g, r, p;
vector<long long> len;
vector<long long> sum;
vector<long long> query;
vector<long long> time_to;
int q;
void input_data() {
  ios_base::sync_with_stdio(false);
  cin >> n >> g >> r;
  len.resize(n + 1);
  sum.resize(n + 1);
  for (int i = 0; i <= n; ++i) {
    cin >> len[i];
  }
  for (int i = n; i >= 0; --i) {
    sum[i] = len[i] + ((i == n) ? 0LL : sum[i + 1]);
  }
  cin >> q;
  query.resize(q);
  for (int i = 0; i < q; ++i) {
    cin >> query[i];
  }
}
void add_id(const long long pos, const int v, const int val) {
  if (pos >= tree[v].left && pos <= tree[v].right) {
    if (tree[v].left == tree[v].right) {
      tree[v].x = min(tree[v].x, val);
    } else {
      add_id(pos, v * 2, val);
      add_id(pos, v * 2 + 1, val);
      tree[v].x = min(tree[v * 2].x, tree[v * 2 + 1].x);
    }
  }
}
int get_min(const long long l, const long long r, const int v) {
  long long l1 = tree[v].left, r1 = tree[v].right;
  int res = n + 2;
  if (max(l1, l) <= min(r1, r)) {
    if (l <= l1 && r >= r1) {
      res = min(res, tree[v].x);
    } else {
      res = min(get_min(l, r, v * 2), get_min(l, r, v * 2 + 1));
    }
  }
  return res;
}
long long get_id(const long long x) {
  long long left_b = (g - x % p + p) % p, right_b = (g + r - x % p - 1 + p) % p;
  int cur_res = n + 2;
  if (left_b <= right_b) {
    cur_res = min(cur_res, get_min(left_b, right_b, 1));
  } else {
    cur_res = min(cur_res, min(get_min(0, right_b, 1), get_min(left_b, p, 1)));
  }
  long long res = 0LL;
  if (cur_res == n + 2) {
    res = x;
  } else {
    long long t_add = (p - (x - sum[cur_res]) % p) % p + (x - sum[cur_res]);
    res = t_add + time_to[cur_res];
  }
  return res;
}
void calc() {
  vector<long long> stp;
  p = r + g;
  for (int i = 1; i <= n; ++i) {
    stp.push_back((p - sum[i] % p) % p);
  }
  sort(stp.begin(), stp.end());
  int un = unique(stp.begin(), stp.end()) - stp.begin();
  stp.resize(un);
  curk = 2;
  while (curk < un) {
    curk *= 2;
  }
  tree.resize(2 * curk);
  for (int i = 0; i < un; ++i) {
    tree[i + curk].x = n + 2;
    tree[i + curk].left = tree[i + curk].right = stp[i];
  }
  for (int i = un; i < curk; ++i) {
    tree[i + curk].x = n + 2;
    tree[i + curk].left = tree[i + curk].right = LINF;
  }
  for (int i = curk - 1; i > 0; --i) {
    tree[i].x = n + 2;
    tree[i].left = tree[i * 2].left;
    tree[i].right = tree[i * 2 + 1].right;
  }
  time_to.assign(n + 1, 0LL);
  for (int i = n; i > 0; --i) {
    time_to[i] = get_id(sum[i]);
    add_id((p - sum[i] % p) % p, 1, i);
  }
  for (int i = 0; i < q; ++i) {
    cout << get_id(sum[0] + query[i]) << "\n";
  }
}
int main() {
  input_data();
  calc();
  return 0;
}
