#include <bits/stdc++.h>
using namespace std;
int ch[100100][2], fa[100100], sz[100100];
inline bool isroot(const int &first) {
  return (ch[fa[first]][0] != first) && (ch[fa[first]][1] != first);
}
inline void pushup(const int &first) {
  sz[first] = sz[ch[first][0]] + sz[ch[first][1]] + 1;
}
inline void rotate(int first) {
  int second = fa[first], z = fa[second], l = (ch[second][1] == first);
  if (!isroot(second)) ch[z][ch[z][1] == second] = first;
  ch[second][l] = ch[first][l ^ 1];
  ch[first][l ^ 1] = second;
  fa[ch[second][l]] = second;
  fa[second] = first;
  fa[first] = z;
  pushup(second);
  pushup(first);
}
inline void splay(int first) {
  while (!isroot(first)) {
    int second = fa[first], z = fa[second];
    if (!isroot(second)) {
      if ((ch[second][0] == z) ^ (ch[z][0] == second))
        rotate(first);
      else
        rotate(second);
    }
    rotate(first);
  }
}
inline void access(int first) {
  for (int second = 0; first; second = first, first = fa[first])
    splay(first), ch[first][1] = second, pushup(first);
}
inline void link(int first, int second) {
  access(first);
  splay(first);
  fa[first] = second;
}
inline void cut(int first) {
  access(first);
  splay(first);
  fa[ch[first][0]] = 0;
  ch[first][0] = 0;
  pushup(first);
}
const int SZ = 60;
int n, a[100100], cur[100100];
int mx[100100][17], mn[100100][17];
pair<int, int> p[100100 * SZ];
int nn;
void pre(int n) {
  for (int i = 1; i <= n; i++) mn[i][0] = mx[i][0] = a[i];
  for (int j = 0; j < 16; j++)
    for (int i = 1; i + (1 << j) <= n; i++) {
      mn[i][j + 1] = min(mn[i][j], mn[i + (1 << j)][j]);
      mx[i][j + 1] = max(mx[i][j], mx[i + (1 << j)][j]);
    }
  for (int i = 1; i <= n; i++) {
    int l = a[i], r = a[i];
    for (int j = 1; j <= SZ && i + j <= n; j++) {
      l = min(l, a[i + j]);
      r = max(r, a[i + j]);
      p[nn++] = pair<int, int>(r - l, i);
    }
  }
  sort(p, p + nn);
  for (int i = 1; i < n; i++) fa[i] = i + 1;
  for (int i = 1; i <= n; i++) sz[i] = 1, cur[i] = i;
}
pair<int, int> query(int u) {
  access(u);
  splay(u);
  int first = u;
  while (ch[first][0]) first = ch[first][0];
  return pair<int, int>(sz[u], first);
}
pair<int, int> q[100100];
int ans[100100];
int go(int u, int d) {
  int l = a[u], r = a[u], ll = l, rr = r;
  for (int i = 17; i--;) {
    if (u + (1 << i) > n + 1) continue;
    if (ll > mn[u][i]) ll = mn[u][i];
    if (rr < mx[u][i]) rr = mx[u][i];
    if (rr - ll <= d)
      l = ll, r = rr, u += (1 << i);
    else
      ll = l, rr = r;
  }
  return u;
}
int solve(int d) {
  int u = 1;
  int ans = 0;
  while (u <= n) {
    pair<int, int> res = query(u);
    if (res.second == u)
      ans++, u = go(u, d);
    else
      ans += res.first - 1, u = res.second;
  }
  return ans;
}
int main() {
  int w, m;
  cin >> n >> w >> m;
  for (int i = 1; i <= n; i++) scanf("%d", a + i);
  pre(n);
  for (int i = 0; i < m; i++)
    scanf("%d", &q[i].first), q[i].first = w - q[i].first, q[i].second = i;
  sort(q, q + m);
  for (int i = 0, now = 0; i < m; i++) {
    while (now < nn && p[now].first <= q[i].first) {
      int u = p[now].second;
      cur[u]++;
      cut(u);
      if (cur[u] <= n && cur[u] - u < SZ) link(u, cur[u] + 1);
      now++;
    }
    ans[q[i].second] = solve(q[i].first) - 1;
  }
  for (int i = 0; i < m; i++) printf("%d\n", ans[i]);
  return 0;
}
