#include <bits/stdc++.h>
using namespace std;
int N;
long long dist[100010], query[100010];
long long dp[100010];
int read(void) {
  int x;
  scanf("%d", &x);
  return x;
}
map<int, int> mp;
int sz;
int pm[100010];
struct node {
  int val, small, big;
};
node tree[2 * (1 << 17)];
void init(void) {
  int i;
  for ((i) = 0; (i) < (int)((1 << 17)); (i)++) {
    int x = ((i < sz) ? pm[i] : 2100000000);
    tree[(1 << 17) + i].val = N;
    tree[(1 << 17) + i].small = tree[(1 << 17) + i].big = x;
  }
  for (i = (1 << 17) - 1; i >= 1; i--) {
    tree[i].val = N;
    tree[i].small = tree[2 * i].small;
    tree[i].big = tree[2 * i + 1].big;
  }
}
int min_query(int low, int high, int id = 1) {
  if (tree[id].small >= low && tree[id].big < high) return tree[id].val;
  if (tree[id].small >= high || tree[id].big < low) return N;
  int ans1 = min_query(low, high, 2 * id);
  int ans2 = min_query(low, high, 2 * id + 1);
  return min(ans1, ans2);
}
void update_query(int x, int val) {
  int id = (1 << 17) + x;
  while (id >= 1) {
    tree[id].val = min(tree[id].val, val);
    id /= 2;
  }
}
int main(void) {
  int G, R, Q, i;
  N = read();
  G = read();
  R = read();
  for ((i) = 0; (i) < (int)(N + 1); (i)++) dist[i] = read();
  Q = read();
  for ((i) = 0; (i) < (int)(Q); (i)++) query[i] = read();
  for (i = 1; i <= N; i++) dist[i] += dist[i - 1];
  for ((i) = 0; (i) < (int)(N); (i)++) {
    int tmp2 = (R + G - (int)(dist[i] % (R + G))) % (R + G);
    mp[tmp2] = 0;
  }
  for (__typeof((mp).begin()) itr = (mp).begin(); itr != (mp).end(); itr++) {
    (itr->second) = sz;
    pm[sz] = (itr->first);
    sz++;
  }
  init();
  for (i = N - 1; i >= 0; i--) {
    int tmp = R + G - (int)(dist[i] % (R + G));
    int low = (tmp + 1) % (R + G);
    int high = (tmp + 1 + R) % (R + G);
    int stop;
    if (low < high)
      stop = min_query(low, high);
    else
      stop = min(min_query(low, R + G), min_query(0, high));
    if (stop == N) {
      dp[i] = dist[N] - dist[i];
    } else {
      dp[i] = (dist[stop] - dist[i]) / (R + G) * (R + G) + (R + G) + dp[stop];
    }
    int tmp2 = (R + G - (int)(dist[i] % (R + G))) % (R + G);
    update_query(mp[tmp2], i);
  }
  for ((i) = 0; (i) < (int)(Q); (i)++) {
    int tmp = (int)(query[i] % (R + G));
    int low = (tmp + 1) % (R + G);
    int high = (tmp + 1 + R) % (R + G);
    int stop;
    if (low < high)
      stop = min_query(low, high);
    else
      stop = min(min_query(low, R + G), min_query(0, high));
    long long ans = 0;
    if (stop == N) {
      ans = query[i] + dist[N];
    } else {
      ans = (query[i] + dist[stop]) / (R + G) * (R + G) + (R + G) + dp[stop];
    }
    cout << ans << endl;
  }
  return 0;
}
