#include <bits/stdc++.h>
void Get(int &T) {
  char C;
  bool F = 0;
  for (; C = getchar(), C < '0' || C > '9';)
    if (C == '-') F = 1;
  for (T = C - '0'; C = getchar(), C >= '0' && C <= '9'; T = T * 10 + C - '0')
    ;
  F && (T = -T);
}
int N, G, R, P;
int A[100005];
long long SumA;
void Init() {
  Get(N);
  Get(G);
  Get(R);
  for (int i = 0; i <= N; i++) {
    Get(A[i]);
    SumA += A[i];
  }
  P = G + R;
  for (int i = N + 1; i >= 0; i--) (A[i] += A[i + 1]) %= P;
  for (int i = N + 1; i >= 0; i--) (A[i] = P - A[i]) %= P;
}
struct Tr {
  int L, R, X;
} T[3500005];
int TTop;
int Add(int Old, int L, int R, int Pos, int X) {
  TTop++;
  int ID = TTop;
  T[ID] = T[Old];
  T[ID].X = X;
  if (L == R) return ID;
  int Mid = L + R;
  Mid >>= 1;
  if (Pos <= Mid)
    T[ID].L = Add(T[ID].L, L, Mid, Pos, X);
  else
    T[ID].R = Add(T[ID].R, Mid + 1, R, Pos, X);
  return ID;
}
void Visit9(int Old, int L, int R) {
  printf("[%d]  %d %d = %d\n", Old, L, R, T[Old].X);
  if (L == R) return;
  int Mid = L + R;
  Mid >>= 1;
  Visit9(T[Old].L, L, Mid);
  Visit9(T[Old].R, Mid + 1, R);
}
int Ask(int Old, int L, int R, int X, int Y) {
  if (X <= L && R <= Y) {
    int Ans = T[Old].X;
    return Ans;
  }
  int Ans = 0x2f2f2f2f;
  int Mid = L + R;
  Mid >>= 1;
  if (Mid >= X) {
    int Ans0 = Ask(T[Old].L, L, Mid, X, Y);
    if (Ans > Ans0) Ans = Ans0;
  }
  if (Mid + 1 <= Y) {
    int Ans0 = Ask(T[Old].R, Mid + 1, R, X, Y);
    if (Ans > Ans0) Ans = Ans0;
  }
  return Ans;
}
long long Delay[100005];
int M;
void Work() {
  T[0].X = 0x2f2f2f2f;
  int Root = 0;
  for (int i = N; i >= 1; i--) {
    Root = Add(Root, 0, P - 1, A[i], i);
    int Le = G;
    int Ri = G + R - 1;
    (Le += A[i]) %= P;
    (Ri += A[i]) %= P;
    if (Le < 0) Le += P;
    if (Ri < 0) Ri += P;
    int Ans;
    if (Ri < Le) {
      Ans = Ask(Root, 0, P - 1, Le, P - 1);
      int Ans0 = Ask(Root, 0, P - 1, 0, Ri);
      if (Ans > Ans0) Ans = Ans0;
    } else {
      Ans = Ask(Root, 0, P - 1, Le, Ri);
    }
    if (Ans >= 0x2f2f2f2f) {
      Delay[i] = 0;
    } else {
      (Delay[i] = A[i] - A[Ans]) %= P;
      if (Delay[i] < 0) Delay[i] += P;
      Delay[i] += Delay[Ans];
    }
  }
  Get(M);
  for (int k = 1, T; k <= M; k++) {
    Get(T);
    int Le = G;
    int Ri = G + R - 1;
    (Le += A[0] - T) %= P;
    (Ri += A[0] - T) %= P;
    if (Le < 0) Le += P;
    if (Ri < 0) Ri += P;
    int Ans;
    if (Ri < Le) {
      Ans = Ask(Root, 0, P - 1, Le, P - 1);
      int Ans0 = Ask(Root, 0, P - 1, 0, Ri);
      if (Ans > Ans0) Ans = Ans0;
    } else {
      Ans = Ask(Root, 0, P - 1, Le, Ri);
    }
    if (Ans >= 0x2f2f2f2f) {
      Delay[0] = 0;
    } else {
      (Delay[0] = (A[0] - A[Ans]) % P - T) %= P;
      if (Delay[0] < 0) Delay[0] += P;
      Delay[0] += Delay[Ans];
    }
    Delay[0] += SumA + T;
    printf("%I64d\n", Delay[0]);
  }
}
int main() {
  Init();
  Work();
  return 0;
}
