#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100233, B = 100, INF = 0x7f7f7f7f;
int n, w, Q, K[MAXN], pos[MAXN];
int ans[MAXN];
int a[MAXN], nxt[MAXN];
int t[MAXN], mi[MAXN][17], mx[MAXN][17];
bool cmp(const int &aa, const int &bb) { return K[aa] < K[bb]; }
struct node {
  int v, x, y;
  node() {}
  node(int vv, int xx, int yy) { v = vv, x = xx, y = yy; }
};
bool operator<(const node &aa, const node &bb) { return aa.v > bb.v; }
vector<node> e;
struct LCT {
  int fa[MAXN], ch[MAXN][2];
  int siz[MAXN];
  bool isroot(int x) { return ch[fa[x]][0] != x && ch[fa[x]][1] != x; }
  int get(int x) { return ch[fa[x]][1] == x; }
  void up(int x) { siz[x] = siz[ch[x][0]] + siz[ch[x][1]] + 1; }
  void rotate(int x) {
    int f1 = fa[x], f2 = fa[f1], id = get(x);
    ch[f1][id] = ch[x][id ^ 1];
    fa[ch[f1][id]] = f1;
    if (!isroot(f1)) ch[f2][get(f1)] = x;
    fa[x] = f2;
    ch[x][id ^ 1] = f1;
    fa[f1] = x;
    up(f1);
  }
  void splay(int x) {
    while (!isroot(x)) {
      int f1 = fa[x];
      if (!isroot(f1)) {
        if (get(f1) == get(x))
          rotate(f1);
        else
          rotate(x);
      }
      rotate(x);
    }
    up(x);
  }
  void access(int x) {
    for (int y = 0; x; y = x, x = fa[x]) splay(x), ch[x][1] = y, up(x);
  }
  void link(int x, int y) {
    access(x), splay(x);
    fa[x] = y;
  }
  void cut(int x, int y) {
    access(x), splay(y);
    ch[y][1] = fa[x] = 0;
    up(y);
  }
  int findroot(int x, int &dis) {
    access(x), splay(x);
    while (ch[x][0]) x = ch[x][0];
    splay(x);
    dis = siz[x];
    return x;
  }
} tr;
int get_min(int l, int r) {
  int tt = t[r - l + 1];
  return min(mi[l][tt], mi[r - (1 << tt) + 1][tt]);
}
int get_max(int l, int r) {
  int tt = t[r - l + 1];
  return max(mx[l][tt], mx[r - (1 << tt) + 1][tt]);
}
int get_nxt(int bg, int lim) {
  int l = bg, r = n, ret = bg;
  while (l <= r) {
    int mid = (l + r) >> 1;
    if (get_max(bg, mid) - get_min(bg, mid) <= lim)
      ret = mid, l = mid + 1;
    else
      r = mid - 1;
  }
  return ret;
}
int solve(int lim) {
  int x = 1, ret = 0;
  while (x != n) {
    int delta = 0;
    x = tr.findroot(x, delta);
    ret += delta - 1;
    if (x == n) break;
    x = get_nxt(x, lim) + 1;
    ++ret;
  }
  return ret - 1;
}
int main() {
  scanf("%d%d%d", &n, &w, &Q);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  a[++n] = INF;
  for (int i = 1; i <= n; i++) mx[i][0] = mi[i][0] = a[i];
  for (int j = 1; j <= 16; j++)
    for (int i = 1; i + (1 << j) - 1 <= n; i++)
      mi[i][j] = min(mi[i][j - 1], mi[i + (1 << j - 1)][j - 1]),
      mx[i][j] = max(mx[i][j - 1], mx[i + (1 << j - 1)][j - 1]);
  for (int i = 2; i <= n; i++) t[i] = t[i >> 1] + 1;
  for (int i = 1; i < n; i++) {
    int vmi = a[i], vmx = a[i], pre = 0;
    for (int j = i + 1; j < n && j <= i + B; j++) {
      vmi = min(vmi, a[j]);
      vmx = max(vmx, a[j]);
      if (vmx - vmi > pre) {
        pre = vmx - vmi;
        e.push_back(node(pre, i, j));
      }
    }
  }
  sort(e.begin(), e.end());
  for (int i = 1; i <= Q; i++) scanf("%d", &K[i]);
  for (int i = 1; i <= Q; i++) pos[i] = i;
  sort(pos + 1, pos + Q + 1, cmp);
  for (int i = 1, lim, p = 0; i <= Q; i++) {
    lim = w - K[pos[i]];
    while (p < (int)e.size() && e[p].v > lim) {
      if (nxt[e[p].x]) tr.cut(e[p].x, nxt[e[p].x]);
      nxt[e[p].x] = e[p].y;
      tr.link(e[p].x, nxt[e[p].x]);
      ++p;
    }
    ans[pos[i]] = solve(lim);
  }
  for (int i = 1; i <= Q; i++) printf("%d\n", ans[i]);
  return 0;
}
