#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0;
  bool f = 0;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar()) f = (ch == '-');
  for (; isdigit(ch); ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ 48);
  return f ? -x : x;
}
const int maxn = 1e5 + 7;
int n, w, q, sqr;
int mn[20][maxn], mx[20][maxn], hb[maxn];
inline int que(int L, int R) {
  int w = hb[R - L + 1];
  return max(mx[w][L], mx[w][R - (1 << w) + 1]) -
         min(mn[w][L], mn[w][R - (1 << w) + 1]);
}
int ans[maxn];
int pos[maxn];
vector<int> chg[maxn];
pair<int, int> pr[maxn];
inline int getnx(int st, int k) {
  int L = st, R = n;
  while (L < R) {
    int mid = (L + R + 1) >> 1;
    if (que(st, mid) <= k)
      L = mid;
    else
      R = mid - 1;
  }
  return R;
}
inline int quelim(int k) {
  pair<int, int> tmp = make_pair(k, 0);
  return lower_bound(pr + 1, pr + 1 + q, tmp) - pr;
}
int c[maxn][2], f[maxn], sz[maxn];
inline bool get(int x) { return c[f[x]][1] == x; }
inline bool notrt(int x) { return c[f[x]][1] == x || c[f[x]][0] == x; }
inline void pushup(int x) { sz[x] = sz[c[x][0]] + sz[c[x][1]] + 1; }
inline void rotate(int x) {
  int fa = f[x], ff = f[fa], w = get(x), ch = c[x][!w];
  if (notrt(fa)) c[ff][get(fa)] = x;
  c[x][!w] = fa;
  c[fa][w] = ch;
  if (ch) f[ch] = fa;
  f[fa] = x;
  f[x] = ff;
  pushup(fa);
}
inline void splay(int x) {
  for (; notrt(x); rotate(x))
    if (notrt(f[x])) rotate(get(x) == get(f[x]) ? f[x] : x);
  pushup(x);
}
inline void access(int x) {
  for (int y = 0; x; y = x, x = f[x]) splay(x), c[x][1] = y, pushup(x);
}
inline void link(int x, int y) {
  ++x;
  ++y;
  access(x);
  splay(x);
  f[x] = y;
}
inline void cut(int x, int y) {
  ++x;
  ++y;
  access(x);
  splay(x);
  f[c[x][0]] = 0;
  c[x][0] = 0;
}
inline int jmp(int &x) {
  ++x;
  access(x);
  splay(x);
  if (!c[x][0]) return --x, 0;
  int ret = sz[c[x][0]];
  x = c[x][0];
  while (c[x][0]) x = c[x][0];
  --x;
  return ret;
}
inline int calc(int qwq) {
  int val = pr[qwq].first;
  if (qwq == 1) {
    for (int i = 0; i < n; ++i) {
      int p = getnx(i + 1, val);
      pos[i] = p;
      if (p - i <= sqr) {
        link(i, p);
        if (p < n) chg[quelim(que(i + 1, p + 1))].push_back(i);
      }
    }
  } else {
    for (int j = 0; j < chg[qwq].size(); ++j) {
      int i = chg[qwq][j];
      cut(i, pos[i]);
      int p = getnx(i + 1, val);
      pos[i] = p;
      if (p - i <= sqr) {
        link(i, p);
        if (p < n) chg[quelim(que(i + 1, p + 1))].push_back(i);
      }
    }
  }
  int ret = -1, now = 0;
  while (1) {
    ret += jmp(now);
    if (now == n) break;
    ++ret;
    now = getnx(now + 1, val);
  }
  return ret;
}
int main() {
  n = read();
  w = read();
  q = read();
  sqr = sqrt(n);
  hb[0] = -1;
  for (int i = 1; i <= n + 1; ++i) pushup(i);
  for (int i = 1; i <= n; ++i)
    mn[0][i] = mx[0][i] = read(), hb[i] = hb[i >> 1] + 1;
  for (int u = 1; u < 20; ++u)
    for (int i = 1; i + (1 << u) - 1 <= n; ++i)
      mn[u][i] = min(mn[u - 1][i], mn[u - 1][i + (1 << (u - 1))]);
  for (int u = 1; u < 20; ++u)
    for (int i = 1; i + (1 << u) - 1 <= n; ++i)
      mx[u][i] = max(mx[u - 1][i], mx[u - 1][i + (1 << (u - 1))]);
  for (int i = 1; i <= q; ++i) pr[i].second = i, pr[i].first = w - read();
  sort(pr + 1, pr + 1 + q);
  for (int i = 1; i <= q; ++i) ans[pr[i].second] = calc(i);
  for (int i = 1; i <= q; ++i) printf("%d\n", ans[i]);
  return 0;
}
