#include <bits/stdc++.h>
using namespace std;
template <typename Type>
void Get_Val(Type &Ret) {
  Ret = 0;
  char ch;
  while (ch = getchar(), ch > '9' || ch < '0')
    ;
  do {
    (Ret *= 10) += ch - '0';
  } while (ch = getchar(), ch >= '0' && ch <= '9');
}
const int Max_N(100050);
int N;
long long int G, R, L[Max_N];
void init() {
  Get_Val(N), Get_Val(G), Get_Val(R);
  for (int i = 1; i <= N + 1; ++i) Get_Val(L[i]), L[i] += L[i - 1];
}
struct node {
  int lch, rch, Min;
};
int root, tot;
node segt[Max_N * 40];
void insert(int &cur, const long long int &LEFT, const long long int &RIGHT,
            const long long int &pos, const int &v) {
  if (!cur) segt[++tot] = segt[cur], cur = tot;
  (segt[cur].Min) = v;
  if (LEFT == RIGHT) return;
  long long int MID = LEFT + ((RIGHT - LEFT) >> 1LL);
  if (pos <= MID)
    insert((segt[cur].lch), LEFT, MID, pos, v);
  else
    insert((segt[cur].rch), MID + 1LL, RIGHT, pos, v);
}
int query(const int &cur, const long long int &LEFT, const long long int &RIGHT,
          const long long int &l, const long long int &r) {
  if (!cur) return 0X3F3F3F3F;
  if (LEFT == l && RIGHT == r) return (segt[cur].Min);
  long long int MID = LEFT + ((RIGHT - LEFT) >> 1LL);
  if (r <= MID)
    return query((segt[cur].lch), LEFT, MID, l, r);
  else if (l > MID)
    return query((segt[cur].rch), MID + 1LL, RIGHT, l, r);
  else
    return min(query((segt[cur].lch), LEFT, MID, l, MID),
               query((segt[cur].rch), MID + 1LL, RIGHT, MID + 1LL, r));
}
long long int F[Max_N];
void dp() {
  for (int i = N, j; i >= 1; --i) {
    j = 0X3F3F3F3F;
    if (L[i] % (G + R) + G < G + R)
      j = min(j,
              query(root, 0LL, G + R - 1LL, L[i] % (G + R) + G, G + R - 1LL));
    if (L[i] % (G + R))
      j = min(j, query(root, 0LL, G + R - 1LL, max(0LL, L[i] % (G + R) - R),
                       L[i] % (G + R) - 1LL));
    if (j <= N)
      F[i] = (L[j] - L[i]) + (G + R) - (L[j] - L[i]) % (G + R) + F[j];
    else
      F[i] = L[N + 1] - L[i];
    insert(root, 0LL, G + R - 1LL, L[i] % (G + R), i);
  }
}
void work() {
  int Q, j;
  long long int s, Ans;
  Get_Val(Q);
  while (Q--) {
    Get_Val(s), Ans = s, s %= (G + R);
    j = 0X3F3F3F3F;
    if (max(0LL, G - s) + s < G + R)
      j = min(j,
              query(root, 0LL, G + R - 1LL, max(0LL, G - s), G + R - s - 1LL));
    if (G + R - s + G < G + R)
      j = min(j, query(root, 0LL, G + R - 1LL, G + R - s + G, G + R - 1LL));
    if (j == 0X3F3F3F3F)
      Ans += L[N + 1];
    else
      Ans += L[j] + (G + R) - (s + L[j]) % (G + R) + F[j];
    printf("%I64d\n", Ans);
  }
}
int main() {
  init();
  dp();
  work();
  return 0;
}
