#include <bits/stdc++.h>
using namespace std;
const int inf = 0x7fffffff;
const double eps = 1e-10;
const double pi = acos(-1.0);
inline int read() {
  int x = 0, f = 1;
  char ch;
  ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = 0;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 1) + (x << 3) + (ch & 15);
    ch = getchar();
  }
  if (f)
    return x;
  else
    return -x;
}
using namespace std;
const int N = 1e5 + 5;
struct query {
  int id, w;
} Q[N << 6];
inline bool operator<(const query &a, const query &b) {
  return a.w == b.w ? a.id > b.id : a.w < b.w;
}
int Max[20][N], Min[20][N], x[N], nex[N], blo[N][2], jmp[N][2], ans[N], n, w, q,
    size, top;
void update(int v) {
  if (nex[v] == n + 1 || (nex[v] - 1) % size == 0)
    jmp[v][0] = 1, jmp[v][1] = v;
  else
    jmp[v][0] = jmp[nex[v]][0] + 1, jmp[v][1] = jmp[nex[v]][1];
}
int cnt, Ans, u, v, mn, mx, maxn, minn;
int main() {
  n = read();
  w = read();
  top = q = read();
  for (int i = 1; i <= n; i++) Min[0][i] = Max[0][i] = x[i] = read();
  for (int i = 1; i <= q; i++) Q[i].w = w - read(), Q[i].id = i - q;
  for (; size * size * size < 6 * n; ++size)
    ;
  for (int j = 1; (1 << j) <= n; ++j)
    for (int i = 1; i + (1 << j) <= n + 1; ++i)
      Min[j][i] = min(Min[j - 1][i], Min[j - 1][i + (1 << j - 1)]),
      Max[j][i] = max(Max[j - 1][i], Max[j - 1][i + (1 << j - 1)]);
  for (int i = n; i >= 1; --i) {
    nex[i] = i + 1, blo[i][0] = blo[i][1] = x[i], update(i);
    for (int j = i + 1, mn = x[i], mx = x[i]; j <= n && (j - 1) % size > 0; ++j)
      mn = min(mn, x[j]), mx = max(mx, x[j]), Q[++top] = (query){i, mx - mn};
  }
  sort(Q + 1, Q + 1 + top);
  for (int i = 1; i <= top; ++i)
    if (Q[i].id <= 0)
      for (u = 1, Ans = -1; u <= n; ans[Q[i].id + q] = Ans) {
        Ans += jmp[u][0], u = jmp[u][1], mn = blo[u][0], mx = blo[u][1], v = u,
                          cnt = 0;
        for (; u + (1 << cnt) <= n + 1 &&
               (maxn = max(mx, Max[cnt][u])) - (minn = min(mn, Min[cnt][u])) <=
                   Q[i].w;
             ++cnt)
          mx = maxn, mn = minn;
        for (; cnt--;)
          if (v + (1 << cnt) <= n + 1 &&
              (maxn = max(mx, Max[cnt][v])) - (minn = min(mn, Min[cnt][v])) <=
                  Q[i].w)
            mx = maxn, mn = minn, v += 1 << cnt;
        blo[u][0] = mn, blo[u][1] = mx, u = nex[u] = v;
      }
    else
      for (nex[u = Q[i].id]++, mn = (u - 1) / size * size + 1; u >= mn; --u)
        update(u);
  for (int i = 1; i <= q; ++i) printf("%d\n", ans[i]);
  return 0;
}
