#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
struct tree {
  int c[2], sum, rev, f;
} t[maxn];
pair<int, int> q[maxn];
int a[maxn], n, mx[18][maxn], mn[18][maxn], lg2[maxn], nxt[maxn], ans[maxn], w,
    m, sn, vis[maxn], b[maxn];
vector<int> v[maxn];
void pushup(int x) { t[x].sum = t[t[x].c[0]].sum + t[t[x].c[1]].sum + 1; }
bool isroot(int x) { return t[t[x].f].c[0] != x && t[t[x].f].c[1] != x; }
void rotate(int x) {
  int y = t[x].f, z = t[y].f, l = t[y].c[0] != x, r = l ^ 1;
  if (!isroot(y)) t[z].c[t[z].c[0] != y] = x;
  t[x].f = z, t[y].f = x, t[t[x].c[r]].f = y;
  t[y].c[l] = t[x].c[r], t[x].c[r] = y;
  pushup(y), pushup(x);
}
void splay(int x) {
  while (!isroot(x)) {
    int y = t[x].f, z = t[y].f;
    if (!isroot(y)) t[y].c[0] == x ^ t[z].c[0] == y ? rotate(x) : rotate(y);
    rotate(x);
  }
}
void access(int x) {
  for (register int i = 0; x; i = x, x = t[x].f)
    splay(x), t[x].c[1] = i, pushup(x);
}
int findroot(int x) {
  while (t[x].c[0]) x = t[x].c[0];
  splay(x);
  return x;
}
void link(int x, int y) { access(x), t[x].f = y; }
void cut(int x, int y) {
  access(x), splay(y), t[x].f = t[y].c[1] = 0, pushup(y);
}
int askmax(int l, int r) {
  int len = lg2[r - l + 1];
  return max(mx[len][l], mx[len][r - (1 << len) + 1]);
}
int askmin(int l, int r) {
  int len = lg2[r - l + 1];
  return min(mn[len][l], mn[len][r - (1 << len) + 1]);
}
int getnxt(int x, int k) {
  int l = x, r = n + 1, ans = x;
  while (l <= r) {
    int mid = (l + r) / 2;
    if (askmax(x, mid) - askmin(x, mid) <= k)
      ans = mid, l = mid + 1;
    else
      r = mid - 1;
  }
  return ans;
}
int main() {
  scanf("%d%d%d", &n, &w, &m);
  sn = sqrt(n);
  for (register int i = 1; i <= n; i++)
    scanf("%d", &a[i]), mx[0][i] = mn[0][i] = a[i],
                        lg2[i] = lg2[i - 1] + ((1 << lg2[i - 1] + 1) == i),
                        t[i].sum = 1;
  lg2[n + 1] = lg2[n] + ((1 << lg2[n] + 1) == n + 1);
  mx[0][n + 1] = 1e9, mn[0][n + 1] = -1e9;
  for (register int j = 1; j <= lg2[n + 1]; j++) {
    for (register int i = 1; i <= n - (1 << j) + 2; i++)
      mx[j][i] = max(mx[j - 1][i], mx[j - 1][i + (1 << j - 1)]),
      mn[j][i] = min(mn[j - 1][i], mn[j - 1][i + (1 << j - 1)]);
  }
  for (register int i = 1; i <= m; i++)
    scanf("%d", &q[i].first), q[i].first = w - q[i].first, q[i].second = i,
                              b[i] = q[i].first;
  sort(b + 1, b + m + 1);
  sort(q + 1, q + m + 1);
  for (register int i = 1; i <= n; i++) nxt[i] = i, v[1].push_back(i);
  for (register int i = 1; i <= m; i++) {
    for (register int j = 0; j < v[i].size(); j++) {
      int k = v[i][j], w = nxt[k] + 1;
      if (nxt[k] != k) cut(k, nxt[k]);
      while (w <= n && w - k <= sn && askmax(k, w) - askmin(k, w) <= q[i].first)
        w++;
      if (w - k > sn)
        vis[k] = 1;
      else {
        nxt[k] = w;
        link(k, w);
        v[lower_bound(b + 1, b + m + 1, askmax(k, w) - askmin(k, w)) - b]
            .push_back(k);
      }
    }
    int w = 0;
    for (register int j = 1; j <= n; j = getnxt(j, q[i].first) + 1) {
      if (!vis[j]) access(j), splay(j), w += t[j].sum - 1, j = findroot(j);
      if (j > n) break;
      w++;
    }
    ans[q[i].second] = w - 1;
  }
  for (register int i = 1; i <= m; i++) printf("%d\n", ans[i]);
  return 0;
}
