#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int n, W, q, a[maxn], ans[maxn], cur[maxn], lg[maxn], st1[20][maxn],
    st2[20][maxn];
vector<pair<int, int>> Q, del;
vector<tuple<int, int, int>> M;
namespace LCT {
int fa[maxn], ch[maxn][2], sz[maxn];
int get(int x) { return ch[fa[x]][1] == x; }
void clear() { ch[0][0] = ch[0][1] = sz[0] = fa[0] = 0; }
int is_root(int x) {
  clear();
  return ch[fa[x]][0] ^ x && ch[fa[x]][1] ^ x;
}
void maintain(int x) { clear(), sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + 1; }
void rotate(int x) {
  int y = fa[x], z = fa[y], chx = get(x), chy = get(y);
  fa[x] = z;
  if (!is_root(y)) ch[z][chy] = x;
  ch[y][chx] = ch[x][chx ^ 1];
  fa[ch[x][chx ^ 1]] = y;
  ch[x][chx ^ 1] = y, fa[y] = x;
  maintain(y), maintain(x), maintain(z);
}
void splay(int x) {
  for (int f = fa[x]; f = fa[x], !is_root(x); rotate(x)) {
    if (!is_root(f)) rotate(get(x) == get(f) ? f : x);
  }
}
void access(int x) {
  int t = x;
  for (int f = 0; x; f = x, x = fa[x]) {
    splay(x), ch[x][1] = f, maintain(x);
  }
  splay(t);
}
int find_root(int x) {
  access(x);
  while (ch[x][0]) x = ch[x][0];
  splay(x);
  return x;
}
void link(int u, int v) { access(u), fa[u] = v; }
void cut(int u, int v) {
  access(u), splay(v);
  fa[u] = ch[v][1] = 0, maintain(v);
}
}  // namespace LCT
int main() {
  scanf("%d %d %d", &n, &W, &q);
  int SZ = 50;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]), st1[0][i] = st2[0][i] = a[i];
  }
  for (int i = 2; i <= n; i++) {
    lg[i] = lg[i >> 1] + 1;
  }
  for (int i = 1; i < 20; i++) {
    for (int j = 1; j + (1 << i) - 1 <= n; j++) {
      st1[i][j] = min(st1[i - 1][j], st1[i - 1][j + (1 << (i - 1))]);
      st2[i][j] = max(st2[i - 1][j], st2[i - 1][j + (1 << (i - 1))]);
    }
  }
  auto qmin = [&](int l, int r) {
    int x = lg[r - l + 1];
    return min(st1[x][l], st1[x][r - (1 << x) + 1]);
  };
  auto qmax = [&](int l, int r) {
    int x = lg[r - l + 1];
    return max(st2[x][l], st2[x][r - (1 << x) + 1]);
  };
  auto nxt = [&](int pos, int x) {
    int l = pos, r = n, ans = pos;
    while (l <= r) {
      int mid = (l + r) >> 1;
      if (qmax(pos, mid) - qmin(pos, mid) <= x)
        l = (ans = mid) + 1;
      else
        r = mid - 1;
    }
    return ans + 1;
  };
  fill(LCT::sz + 1, LCT::sz + n + 2, 1);
  for (int i = 1; i <= n; i++) {
    cur[i] = i + 1;
    int mn = INT_MAX, mx = INT_MIN;
    for (int j = i; j <= min(i + SZ, n); j++) {
      mn = min(mn, a[j]), mx = max(mx, a[j]);
      if (j > i) M.emplace_back(mx - mn, j + 1, i);
    }
    del.emplace_back(mx - mn, i);
    LCT::link(i, i + 1);
  }
  for (int i = 1, x; i <= q; i++) {
    scanf("%d", &x);
    Q.emplace_back(W - x, i);
  }
  sort(M.begin(), M.end());
  sort(Q.begin(), Q.end());
  sort(del.begin(), del.end());
  for (int i = 0, j = 0, k = 0; i < Q.size(); i++) {
    for (; j < M.size() && get<0>(M[j]) <= Q[i].first; j++) {
      LCT::cut(get<2>(M[j]), cur[get<2>(M[j])]);
      LCT::link(get<2>(M[j]), cur[get<2>(M[j])] = get<1>(M[j]));
    }
    for (; k < del.size() && del[k].first <= Q[i].first; k++) {
      LCT::cut(del[k].second, cur[del[k].second]);
    }
    int pos = 1, cnt = 0;
    while (pos <= n) {
      int rt = LCT::find_root(pos);
      cnt += LCT::sz[rt] - 1;
      if (rt > n) break;
      pos = nxt(rt, Q[i].first), cnt++;
    }
    ans[Q[i].second] = cnt;
  }
  for (int i = 1; i <= q; i++) {
    printf("%d\n", ans[i] - 1);
  }
  return 0;
}
