#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
void qread(int &x) {
  int neg = 1;
  x = 0;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') neg = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') x = 10 * x + c - '0', c = getchar();
  x *= neg;
}
const int maxn = 100005;
const int block = 90;
const int mlog = 8;
const int maxs = maxn / block + 5;
int n, w, q;
pair<int, int> qry[maxn];
int x[maxn], mx[maxn][mlog], mn[maxn][mlog];
int nxt[maxn], cnt[maxn], val[maxs], valmx[maxn], valmn[maxn], ans[maxn];
void calc(int id, int d) {
  int l = id * block, r = min(l + block - 1, n - 1);
  val[id] = 1e9;
  for (int i = r; i >= l; i--) {
    int curmx = x[i], curmn = x[i];
    int j = i + 1;
    while (j <= r && max(curmx, x[j]) - min(curmn, x[j]) <= d)
      curmx = max(curmx, x[j]), curmn = min(curmn, x[j]), j++;
    if (j == r + 1)
      nxt[i] = i, cnt[i] = 0, valmn[i] = curmn, valmx[i] = curmx;
    else
      nxt[i] = nxt[j], cnt[i] = cnt[j] + 1, valmn[i] = curmn, valmx[i] = curmx,
      val[id] = min(val[id], max(curmx, x[j]) - min(curmn, x[j]));
  }
}
int jump(int x, int d, int &curmx, int &curmn) {
  for (int i = mlog - 1; i >= 0; i--) {
    if (x + (1 << i) <= n && max(curmx, mx[x][i]) - min(curmn, mn[x][i]) <= d) {
      curmx = max(curmx, mx[x][i]);
      curmn = min(curmn, mn[x][i]);
      x += (1 << i);
    }
  }
  return x;
}
int main() {
  scanf("%d%d%d", &n, &w, &q);
  int s = (n - 1) / block + 1;
  for (int(i) = 0; (i) < n; i++) scanf("%d", &x[i]), mx[i][0] = mn[i][0] = x[i];
  for (int(j) = 1; (j) <= mlog - 1; j++)
    for (int(i) = 0; (i) < n; i++) {
      if (i + (1 << j - 1) < n)
        mx[i][j] = max(mx[i][j - 1], mx[i + (1 << j - 1)][j - 1]);
      else
        mx[i][j] = -1e9;
      if (i + (1 << j - 1) < n)
        mn[i][j] = min(mn[i][j - 1], mn[i + (1 << j - 1)][j - 1]);
      else
        mn[i][j] = 1e9;
    }
  for (int(i) = 0; (i) < s; i++) calc(i, 0);
  for (int(i) = 0; (i) < q; i++) {
    scanf("%d", &qry[i].first);
    qry[i].first = w - qry[i].first;
    qry[i].second = i;
  }
  sort(qry, qry + q);
  for (int(i) = 0; (i) < q; i++) {
    for (int(j) = 0; (j) < s; j++)
      if (val[j] <= qry[i].first) calc(j, qry[i].first);
    int cur = 0, curmx = x[0], curmn = x[0], j = 0;
    for (int(j) = 0; (j) < s; j++) {
      if (cnt[j * block] == 0 &&
          max(curmx, valmx[j * block]) - min(curmn, valmn[j * block]) <=
              qry[i].first) {
        curmx = max(curmx, valmx[j * block]);
        curmn = min(curmn, valmn[j * block]);
      } else {
        int p = jump(j * block, qry[i].first, curmx, curmn);
        cur++;
        cur += cnt[p];
        curmx = valmx[nxt[p]];
        curmn = valmn[nxt[p]];
      }
    }
    ans[qry[i].second] = cur;
  }
  for (int(i) = 0; (i) < q; i++) printf("%d\n", ans[i]);
  return 0;
}
