#include <bits/stdc++.h>
using namespace std;
struct node {
  node *left, *right;
  int count;
};
node pool[4000000];
int ptr = 0;
node *allocate() { return &pool[ptr++]; }
struct PersistentTrie {
  node *root;
  void clear() { root = allocate(); }
  PersistentTrie insert(int k) {
    PersistentTrie res;
    node *cur = root, *last = allocate();
    *last = *cur;
    last->count++;
    res.root = last;
    for (int i = (30); i >= (0); i--) {
      node *p = allocate();
      p->count = 1;
      if (k & (1 << i)) {
        last->right = p;
        if (cur) cur = cur->right;
        if (cur) *p = *cur, p->count++;
      } else {
        last->left = p;
        if (cur) cur = cur->left;
        if (cur) *p = *cur, p->count++;
      }
      last = p;
    }
    return res;
  }
  int query(int k) {
    if (k < 0) return 0;
    node *cur = root;
    int res = 0;
    for (int i = (30); i >= (0); i--)
      if (k & (1 << i)) {
        if (cur->left) res += cur->left->count;
        if (cur->right)
          cur = cur->right;
        else
          return res;
      } else if (cur->left)
        cur = cur->left;
      else
        return res;
    res += cur->count;
    return res;
  }
};
PersistentTrie t[100010];
int n, green, red, period;
int a[100010], rem[100010], nextwait[100010];
long long sum[100010], need[100010];
int solve(int start, int dl, int dr) {
  int left = start, right = n;
  int already = t[start].query(dr) - t[start].query(dl - 1);
  while (left != right) {
    int mid = (left + right) >> 1;
    if (t[mid].query(dr) - t[mid].query(dl - 1) != already)
      right = mid;
    else
      left = mid + 1;
  }
  return left;
}
int ask(int delta) {
  int dl = green - delta, dr = period - delta - 1;
  if (dl >= 0)
    return solve(0, dl, dr);
  else
    return min(solve(0, 0, dr), solve(0, dl + period, period - 1));
}
int ask2(int where) {
  int k = (period - (sum[where] % period)) % period;
  int dl = green - k, dr = period - k - 1;
  if (dl >= 0)
    return solve(where, dl, dr);
  else
    return min(solve(where, 0, dr), solve(where, dl + period, period - 1));
}
long long calc(int k, long long t) {
  if (k == n || t % period == 0) return t;
  return (t / period + 1) * period;
}
void lemon() {
  scanf("%d%d%d", &n, &green, &red);
  period = green + red;
  n++;
  for (int i = (1); i <= (n); i++) scanf("%d", &a[i]);
  rem[0] = 0;
  for (int i = (1); i <= (n); i++) rem[i] = (rem[i - 1] + a[i]) % period;
  t[0].clear();
  for (int i = (1); i <= (n); i++) t[i] = t[i - 1].insert(rem[i]);
  sum[0] = 0;
  for (int i = (1); i <= (n); i++) sum[i] = sum[i - 1] + a[i];
  for (int i = (0); i <= (n - 1); i++) nextwait[i] = ask2(i);
  need[n] = 0;
  for (int i = (n - 1); i >= (0); i--)
    need[i] = need[nextwait[i]] + calc(nextwait[i], sum[nextwait[i]] - sum[i]);
  int qa;
  scanf("%d", &qa);
  for (int i = (1); i <= (qa); i++) {
    int t;
    scanf("%d", &t);
    int delta = t % period;
    int k = ask(delta);
    printf("%I64d\n", need[k] + calc(k, sum[k] + t));
  }
}
int main() {
  ios::sync_with_stdio(true);
  lemon();
  return 0;
}
