#include <bits/stdc++.h>
using namespace std;
const int N = 100005, inf = 0x3f3f3f3f;
const double pw = 2.7;
int n, Q, wk;
int a[N], ans[N];
struct query {
  int k, id;
} q[N];
bool cmpk(const query &x, const query &y) { return x.k < y.k; }
struct RMQ {
  int sgn;
  int lg[N], f[17][N];
  void pref(int SGN) {
    sgn = SGN;
    lg[0] = -1;
    for (int i = 1; i <= n; i++) lg[i] = lg[i >> 1] + 1, f[0][i] = sgn * a[i];
    for (int i = 1; i <= lg[n]; i++)
      for (int j = 1; j <= n - (1 << i) + 1; j++)
        f[i][j] = min(f[i - 1][j], f[i - 1][j + (1 << i - 1)]);
  }
  int qm(int l, int r) {
    int k = lg[r - l + 1];
    return sgn * min(f[k][l], f[k][r - (1 << k) + 1]);
  }
} mi, mx;
int qd(int l, int r) { return mx.qm(l, r) - mi.qm(l, r); }
struct LCT {
  int fa[N], ch[N][2], siz[N];
  int nroot(int u) { return ch[fa[u]][0] == u || ch[fa[u]][1] == u; }
  void pushup(int u) { siz[u] = siz[ch[u][0]] + siz[ch[u][1]] + 1; }
  void rot(int u) {
    int v = fa[u], t = fa[v], d = (u == ch[v][1]);
    if (nroot(v)) ch[t][v == ch[t][1]] = u;
    fa[u] = t;
    fa[ch[u][d ^ 1]] = v;
    ch[v][d] = ch[u][d ^ 1];
    fa[v] = u;
    ch[u][d ^ 1] = v;
    pushup(v);
    pushup(u);
  }
  void splay(int u) {
    while (nroot(u)) {
      int v = fa[u];
      if (nroot(v)) rot(u == ch[v][1] ^ v == ch[fa[v]][1] ? u : v);
      rot(u);
    }
  }
  int access(int u) {
    int v = 0;
    for (; u; v = u, u = fa[u]) splay(u), ch[u][1] = v, pushup(u);
    return v;
  }
  void makeroot(int u) {
    access(u);
    splay(u);
  }
  void Link(int u, int v) {
    makeroot(u);
    makeroot(v);
    fa[u] = v;
  }
  void Cut(int u, int v) {
    access(u);
    splay(v);
    fa[u] = ch[v][1] = 0;
    pushup(v);
  }
} lt;
int len;
int nxt[N];
priority_queue<pair<int, int> > hp;
int bis(int x, int y) {
  int l = nxt[x], r = n + 1;
  while (l < r) {
    int mid = (l + r) >> 1;
    if (qd(x, mid) > y)
      r = mid;
    else
      l = mid + 1;
  }
  return r;
}
int main() {
  scanf("%d%d%d", &n, &wk, &Q);
  for (int i = 1; i <= n; i++) scanf("%d", a + i);
  for (int i = 1; i <= Q; i++)
    scanf("%d", &q[i].k), q[i].k = wk - q[i].k, q[i].id = i;
  sort(q + 1, q + Q + 1, cmpk);
  mi.pref(1);
  mx.pref(-1);
  len = int(ceil(pow(n, 1.0 / pw)));
  for (int i = 1; i <= n; i++) nxt[i] = i, hp.push(make_pair(0, i));
  for (int i = 1; i <= Q; i++) {
    int K = q[i].k;
    while (!hp.empty()) {
      pair<int, int> P = hp.top();
      int d = -P.first, x = P.second;
      if (d <= K) {
        hp.pop();
        if (nxt[x] > x) lt.Cut(x, nxt[x]);
        nxt[x] = bis(x, d);
        if (nxt[x] - x <= len) {
          if (nxt[x] <= n) hp.push(make_pair(-qd(x, nxt[x]), x));
          lt.Link(x, nxt[x]);
        }
      } else
        break;
    }
    int ti = 0, u = 1;
    while (u <= n) {
      if (nxt[u] - u > len)
        ti++, u = nxt[u] = bis(u, K);
      else {
        lt.makeroot(u);
        ti += lt.siz[u] - 1;
        while (lt.ch[u][0]) u = lt.ch[u][0];
        lt.splay(u);
      }
    }
    ans[q[i].id] = ti - 1;
  }
  for (int i = 1; i <= Q; i++) printf("%d\n", ans[i]);
  return 0;
}
