#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int n, w, q;
int r[maxn];
int X[maxn];
bool tag = 0;
struct LCT {
  int ch[maxn][2], fa[maxn], sz[maxn];
  void init() {
    memset(ch, 0, sizeof(ch));
    memset(fa, 0, sizeof(fa));
    for (int i = 1; i <= n; i++) sz[i] = 1;
  }
  bool rightson(int x, int f) { return ch[f][1] == x; }
  bool isroot(int x) { return ch[fa[x]][0] != x && ch[fa[x]][1] != x; }
  void upd(int x) {
    assert(x);
    sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + 1;
  }
  void rotate(int x) {
    int f = fa[x], p = rightson(x, f), q = !p;
    ch[f][p] = ch[x][q];
    assert(f);
    fa[ch[x][q]] = f;
    int g = fa[f];
    ch[x][q] = f;
    assert(x);
    if (!isroot(f)) {
      ch[g][rightson(f, g)] = x;
      assert(g);
    }
    fa[f] = x;
    fa[x] = g;
    upd(f);
    upd(x);
  }
  void splay(int x) {
    while (!isroot(x)) {
      int f = fa[x], g = fa[f];
      if (isroot(f))
        rotate(x);
      else {
        if (!f) {
        }
        if (rightson(x, f) == rightson(f, g)) {
          rotate(f);
          rotate(x);
        } else {
          rotate(x);
          rotate(x);
        }
      }
    }
    upd(x);
  }
  void access(int x) {
    int y = 0;
    while (x) {
      splay(x);
      ch[x][1] = y;
      assert(x);
      upd(x);
      y = x;
      x = fa[x];
    }
  }
  void link(int x, int y) {
    access(x);
    splay(x);
    fa[x] = y;
  }
  void cut(int x) {
    access(x);
    splay(x);
    fa[ch[x][0]] = 0;
    ch[x][0] = 0;
    upd(x);
  }
  int findroot(int x) {
    access(x);
    tag = 1;
    splay(x);
    while (ch[x][0]) x = ch[x][0];
    splay(x);
    return x;
  }
  pair<int, int> query(int x) {
    x = findroot(x);
    return make_pair(x, sz[x]);
  }
} tree;
int mn[17][maxn], mx[17][maxn];
int cmn[maxn], cmx[maxn];
void buildst() {
  for (int i = 1; i <= n; i++) mn[0][i] = mx[0][i] = cmn[i] = cmx[i] = X[i];
  for (int i = 1; i < 17; i++) {
    for (int j = 1; j <= n - (1 << i) + 1; j++) {
      mn[i][j] = min(mn[i - 1][j], mn[i - 1][j + (1 << (i - 1))]);
      mx[i][j] = max(mx[i - 1][j], mx[i - 1][j + (1 << (i - 1))]);
    }
  }
}
int queryst(int x, int lim) {
  for (int i = 16; i >= 0; i--) {
    if (r[x] + (1 << i) <= n &&
        max(cmx[x], mx[i][r[x] + 1]) - min(cmn[x], mn[i][r[x] + 1]) <= lim) {
      cmx[x] = max(cmx[x], mx[i][r[x] + 1]);
      cmn[x] = min(cmn[x], mn[i][r[x] + 1]);
      r[x] += (1 << i);
    }
  }
  return r[x];
}
struct query {
  int id, lim, ans;
  bool operator<(const query &t) const { return lim < t.lim; }
} qs[maxn];
const int SZ = 50;
pair<int, int> events[5500005];
int m = 0;
int iter = 0;
void update(int lim) {
  while (iter < m && events[iter].first <= lim) {
    int x = events[iter++].second;
    r[x]++;
    cmn[x] = min(cmn[x], X[r[x]]);
    cmx[x] = max(cmx[x], X[r[x]]);
    tree.cut(x);
    if (r[x] <= n && r[x] - x <= SZ) tree.link(x, r[x] + 1);
  }
}
int getans(int lim) {
  int x = 1, ans = 0;
  while (x <= n) {
    if (tree.fa[x]) {
      pair<int, int> ret = tree.query(x);
      ans += ret.second - 1;
      x = ret.first;
    } else {
      x = queryst(x, lim) + 1;
      ans++;
    }
  }
  return ans - 1;
}
bool less2(query &a, query &b) { return a.id < b.id; }
int main() {
  scanf("%d%d%d", &n, &w, &q);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &X[i]);
    r[i] = i;
  }
  buildst();
  for (int i = 0; i < q; i++) {
    scanf("%d", &qs[i].lim);
    qs[i].lim = w - qs[i].lim;
    qs[i].id = i;
  }
  sort(qs, qs + q);
  for (int i = 1; i <= n; i++) {
    int curmin = X[i], curmax = X[i];
    for (int j = 1; j <= SZ + 1 && i + j <= n; j++) {
      curmin = min(curmin, X[i + j]);
      curmax = max(curmax, X[i + j]);
      events[m++] = make_pair(curmax - curmin, i);
    }
  }
  sort(events, events + m);
  tree.init();
  for (int i = 1; i <= n; i++) tree.link(i, i + 1);
  for (int i = 0; i < q; i++) {
    update(qs[i].lim);
    qs[i].ans = getans(qs[i].lim);
  }
  sort(qs, qs + q, less2);
  for (int i = 0; i < q; i++) printf("%d\n", qs[i].ans);
  return 0;
}
