#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int n, w, q;
int xi[maxn];
struct query {
  int id, ki, ans;
  bool operator<(const query &t) const { return ki < t.ki; }
} qs[maxn];
const int LEN = 90;
int BLO;
int st[1200], ed[1200], minnxt[1200];
int mx[7][maxn], mn[7][maxn];
void buildst() {
  for (int i = 0; i < n; i++) mx[0][i] = mn[0][i] = xi[i];
  for (int k = 0; k < 6; k++) {
    for (int i = 0; i < n; i++) {
      mx[k + 1][i] = mx[k][i];
      mn[k + 1][i] = mn[k][i];
      if (i + (1 << k) < n) {
        mx[k + 1][i] = max(mx[k + 1][i], mx[k][i + (1 << k)]);
        mn[k + 1][i] = min(mn[k + 1][i], mn[k][i + (1 << k)]);
      }
    }
  }
}
int insidequery(int pos, int kk, int curmin, int curmax) {
  for (int k = 6; k >= 0; k--) {
    if (max(curmax, mx[k][pos]) - min(curmin, mn[k][pos]) <= kk) {
      curmax = max(curmax, mx[k][pos]);
      curmin = min(curmin, mn[k][pos]);
      int tt = pos + (1 << k);
      if (tt >= n) return n;
      pos = tt;
    }
  }
  return pos;
}
int cuts[maxn], nxt[maxn], lst[maxn], lo[maxn], hi[maxn];
void init() {
  for (int i = 0; i < n; i++) {
    cuts[i] = 1;
    nxt[i] = i;
    lst[i] = i;
    lo[i] = hi[i] = xi[i];
  }
}
void calc(int id, int kk) {
  minnxt[id] = 0x3f3f3f3f;
  for (int i = ed[id] - 1; i >= st[id]; i--) {
    if (!cuts[i]) continue;
    int aft = nxt[i], curmin = lo[i], curmax = hi[i];
    while (aft < ed[id] &&
           (max(curmax, xi[aft]) - min(curmin, xi[aft])) <= kk) {
      curmax = max(curmax, xi[aft]);
      curmin = min(curmin, xi[aft]);
      aft++;
    }
    if (aft == ed[id]) {
      cuts[i] = 0;
      lst[i] = i;
      nxt[i] = ed[id];
    } else {
      cuts[i] = cuts[aft] + 1;
      lst[i] = lst[aft];
      nxt[i] = aft;
      minnxt[id] = min(minnxt[id], max(curmax, xi[aft]) - min(curmin, xi[aft]));
    }
    lo[i] = curmin;
    hi[i] = curmax;
  }
}
bool less2(query &a, query &b) { return a.id < b.id; }
int main() {
  scanf("%d%d%d", &n, &w, &q);
  for (int i = 0; i < n; i++) scanf("%d", &xi[i]);
  for (int i = 0; i < q; i++) {
    scanf("%d", &qs[i].ki);
    qs[i].ki = w - qs[i].ki;
    qs[i].id = i;
  }
  buildst();
  init();
  sort(qs, qs + q);
  BLO = (n + LEN - 1) / LEN;
  for (int i = 0; i < BLO; i++) {
    st[i] = i * LEN;
    ed[i] = min(n, i * LEN + LEN);
    calc(i, 0);
  }
  for (int _ = 0; _ < q; _++) {
    int kk = qs[_].ki;
    qs[_].ans = 0;
    for (int i = 0; i < BLO; i++) {
      if (minnxt[i] <= kk) calc(i, kk);
    }
    int curmin = xi[0], curmax = xi[0];
    for (int i = 0; i < BLO; i++) {
      if (max(curmax, hi[st[i]]) - min(curmin, lo[st[i]]) <= kk &&
          !cuts[st[i]]) {
        curmax = max(curmax, hi[st[i]]);
        curmin = min(curmin, lo[st[i]]);
      } else {
        int pos = insidequery(st[i], kk, curmin, curmax);
        qs[_].ans += cuts[pos];
        pos = lst[pos];
        curmax = hi[pos];
        curmin = lo[pos];
        qs[_].ans++;
      }
    }
  }
  sort(qs, qs + q, less2);
  for (int i = 0; i < q; i++) printf("%d\n", qs[i].ans);
  return 0;
}
