#include <bits/stdc++.h>
using namespace std;
const int kInf = 0x3f3f3f3f;
const int kMaxN = 100000;
int n, m, g, r, t[kMaxN + 2], msum[kMaxN + 2];
long long sum[kMaxN + 2], dp[kMaxN + 2];
int q, cnt;
long long val[kMaxN + 2];
int axis[kMaxN + 1];
int pos[kMaxN + 1];
namespace st {
int dp[17][kMaxN + 1];
int log2[kMaxN + 1];
void Init() {
  memset(dp, 0x3f, sizeof(dp));
  for (int i = 1; i <= n; ++i) dp[0][pos[i]] = min(dp[0][pos[i]], i);
  for (int j = 1; j < 17; ++j)
    for (int i = 1; i <= cnt; ++i) {
      dp[j][i] = dp[j - 1][i];
      if (i + (1 << (j - 1)) <= cnt)
        dp[j][i] = min(dp[j][i], dp[j - 1][i + (1 << (j - 1))]);
    }
  log2[1] = 0;
  for (int i = 2; i <= cnt; ++i) {
    log2[i] = log2[i - 1];
    if ((i & (i - 1)) == 0) ++log2[i];
  }
}
int Query(int l, int r) {
  if (l > r) return kInf;
  int s = log2[r - l + 1];
  return min(dp[s][l], dp[s][r - (1 << s) + 1]);
}
}  // namespace st
namespace idt {
int node[kMaxN + 1], ori[kMaxN + 1];
void Init() {
  memset(node, 0x3f, sizeof(node));
  memset(ori, 0x3f, sizeof(ori));
}
void Change(int i, int d) {
  ori[i] = d;
  for (; i <= cnt; i += ((i) & (-(i)))) node[i] = d;
}
int Ask(int l, int r) {
  int res = kInf;
  while (r > l) {
    if (r - ((r) & (-(r))) >= l) {
      res = min(res, node[r]);
      r -= ((r) & (-(r)));
    } else {
      res = min(res, ori[r]);
      --r;
    }
  }
  return res;
}
}  // namespace idt
int main() {
  scanf("%d%d%d", &n, &g, &r);
  m = g + r;
  for (int i = 1; i <= n + 1; ++i) scanf("%d", &t[i]);
  sum[0] = 0;
  for (int i = 1; i <= n + 1; ++i) {
    sum[i] = sum[i - 1] + t[i];
    msum[i] = (msum[i - 1] + t[i]) % m;
  }
  for (int i = 1; i <= n; ++i) axis[cnt++] = msum[i];
  sort(axis, axis + cnt);
  cnt = unique(axis, axis + cnt) - axis;
  for (int i = 1; i <= n; ++i)
    pos[i] = lower_bound(axis, axis + cnt, msum[i]) - axis + 1;
  idt::Init();
  for (int i = n; i >= 0; --i) {
    int t = kInf, lb, rb;
    if (msum[i] < m - g) {
      int lb = lower_bound(axis, axis + cnt, msum[i] + g) - axis + 1;
      int rb = lower_bound(axis, axis + cnt, m) - axis;
      t = min(t, idt::Ask(lb - 1, rb));
    }
    lb = lower_bound(axis, axis + cnt, msum[i] - m + g) - axis + 1;
    rb = lower_bound(axis, axis + cnt, msum[i]) - axis;
    t = min(t, idt::Ask(lb - 1, rb));
    if (t > n)
      val[i] = sum[n + 1] - sum[i];
    else
      val[i] = sum[t] - sum[i] + m - (sum[t] - sum[i]) % m + val[t];
    if (i > 0) idt::Change(pos[i], i);
  }
  st::Init();
  scanf("%d", &q);
  for (int x; q--;) {
    scanf("%d", &x);
    int y = x % m;
    if (y <= g) {
      int lb = lower_bound(axis, axis + cnt, g - y) - axis + 1;
      int rb = lower_bound(axis, axis + cnt, m - y) - axis;
      int t = st::Query(lb, rb);
      if (t > n)
        printf("%I64d\n", x + sum[n + 1]);
      else
        printf("%I64d\n", x + sum[t] + m - (sum[t] + x) % m + val[t]);
    } else {
      int lb = lower_bound(axis, axis + cnt, 0) - axis + 1;
      int rb = lower_bound(axis, axis + cnt, m - y) - axis;
      int t = st::Query(lb, rb);
      lb = lower_bound(axis, axis + cnt, g - y + m) - axis + 1;
      rb = lower_bound(axis, axis + cnt, m) - axis;
      t = min(t, st::Query(lb, rb));
      if (t > n)
        printf("%I64d\n", x + sum[n + 1]);
      else
        printf("%I64d\n", x + sum[t] + m - (sum[t] + x) % m + val[t]);
    }
  }
  return 0;
}
