#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100100;
const int BLOCK = 90;
int N, Q, W;
int X[MAXN];
pair<int, int> query[MAXN];
int ans[MAXN];
vector<int> vchange[MAXN];
int nind[MAXN];
int blo[MAXN], bhi[MAXN];
int mnext;
pair<int, int> ssolve(int cloc, int cq) {
  int jlo = 1e9, jhi = 0;
  int nlast = -1, nuse = 0;
  mnext = 2e9;
  int end = min(cloc + BLOCK, N);
  for (int i = cloc; i < end; i++) {
    if (X[i] < jlo) jlo = X[i];
    if (X[i] > jhi) jhi = X[i];
    if (jhi - jlo > cq) {
      mnext = min(mnext, jhi - jlo);
      nlast = i;
      nuse++;
      jlo = jhi = X[i];
    }
  }
  return make_pair(nlast, nuse);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  cin >> N >> W >> Q;
  for (int i = 0; i < N; i++) {
    cin >> X[i];
  }
  for (int i = 0; i < Q; i++) {
    cin >> query[i].first;
    query[i].first = W - query[i].first;
    query[i].second = i;
  }
  for (int i = 0; i < N; i++) {
    blo[i] = bhi[i] = X[i];
    for (int j = i; j < i + BLOCK && j < N; j++) {
      blo[i] = min(blo[i], X[j]);
      bhi[i] = max(bhi[i], X[j]);
    }
  }
  for (int cloc = 0; cloc < N; cloc++) {
    int cval = 0;
    int end = min(cloc + BLOCK, N);
    while (true) {
      int jlo = 1e9, jhi = 0;
      int nlast = -1, nuse = 0;
      mnext = 2e9;
      for (int i = cloc; i < end; i++) {
        if (X[i] < jlo) jlo = X[i];
        if (X[i] > jhi) jhi = X[i];
        if (jhi - jlo > cval) {
          mnext = min(mnext, jhi - jlo);
          nlast = i;
          nuse++;
          jlo = jhi = X[i];
        }
      }
      vchange[cloc].push_back(mnext);
      vchange[cloc].push_back(nuse);
      vchange[cloc].push_back(nlast);
      if (nlast == -1) break;
      cval = mnext;
    }
  }
  sort(query, query + Q);
  for (int i = 0; i < Q; i++) {
    int cc = query[i].first;
    int cloc = 0;
    int res = 0;
    while (cloc < N) {
      int n = nind[cloc];
      while (vchange[cloc][n] <= cc) {
        n += 3;
        nind[cloc] += 3;
      }
      if (vchange[cloc][n + 2] == -1) {
        res++;
        int jlo = blo[cloc], jhi = bhi[cloc];
        cloc += BLOCK;
        while (cloc < N) {
          if (max(jhi, bhi[cloc]) - min(jlo, blo[cloc]) <= cc) {
            jhi = max(jhi, bhi[cloc]);
            jlo = min(jlo, blo[cloc]);
            cloc += BLOCK;
          } else
            break;
        }
        while (cloc < N) {
          jlo = min(jlo, X[cloc]);
          jhi = max(jhi, X[cloc]);
          if (jhi - jlo > cc) break;
          cloc++;
        }
      } else {
        res += vchange[cloc][n + 1];
        cloc = vchange[cloc][n + 2];
      }
    }
    ans[query[i].second] = res - 1;
  }
  for (int i = 0; i < Q; i++) cout << ans[i] << "\n";
}
