#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
inline int read() {
  int x = 0;
  char e = getchar();
  for (; e < '0' || e > '9'; e = getchar())
    ;
  for (; e >= '0' && e <= '9'; e = getchar())
    x = (x << 1) + (x << 3) + (e ^ 48);
  return x;
}
int Ans[N], nxt[N], B;
vector<pair<int, int> > det;
int n, w, Q;
int a[N];
struct LCT {
  int ch[N][2], fa[N], size[N];
  inline void update(int x) { size[x] = size[ch[x][0]] + size[ch[x][1]] + 1; }
  inline int get(int x) { return ch[fa[x]][1] == x; }
  inline int isrt(int x) { return (ch[fa[x]][0] != x) && (ch[fa[x]][1] != x); }
  inline void rotate(int x) {
    int old = fa[x], oldf = fa[fa[x]], k = get(x);
    if (!isrt(old)) ch[oldf][ch[oldf][1] == old] = x;
    ch[old][k] = ch[x][k ^ 1], ch[x][k ^ 1] = old;
    fa[ch[old][k]] = old, fa[old] = x, fa[x] = oldf;
    update(old), update(x);
  }
  inline void Splay(int x) {
    for (; !isrt(x); rotate(x))
      if (!isrt(fa[x])) rotate(get(x) == get(fa[x]) ? fa[x] : x);
  }
  inline void Access(int x) {
    for (int e = 0; x; e = x, x = fa[x]) Splay(x), ch[x][1] = e, update(x);
  }
  inline int find(int x) {
    Access(x), Splay(x);
    while (ch[x][0]) x = ch[x][0];
    Splay(x);
    return x;
  }
  inline void Cut(int x, int y) { Access(y), Splay(x), fa[x] = 0; }
  inline void Link(int x, int y) { fa[x] = y; }
} T;
inline void modify(int lim) {
  static int p = 0;
  while (p < det.size() && det[p].first <= lim) {
    int u = det[p++].second;
    if (nxt[u] + u > n)
      continue;
    else if ((++nxt[u]) == B)
      T.Cut(u, u + nxt[u]);
    else
      T.Cut(u, u + nxt[u]), T.Link(u, u + nxt[u] + 1);
  }
}
inline int Min(int a, int b) { return a < b ? a : b; }
inline int Max(int a, int b) { return a > b ? a : b; }
struct ST {
  int mn[20][N], mx[20][N], Log[N];
  inline void build() {
    for (int i = 2; i <= n; i++) Log[i] = Log[i >> 1] + 1;
    for (int i = 1; i <= n; i++) mn[0][i] = mx[0][i] = a[i];
    for (int j = 1; (1 << j) <= n; j++)
      for (int i = 1; i + (1 << j) - 1 <= n; i++) {
        mn[j][i] = Min(mn[j - 1][i], mn[j - 1][i + (1 << (j - 1))]);
        mx[j][i] = Max(mx[j - 1][i], mx[j - 1][i + (1 << (j - 1))]);
      }
  }
  inline int Next(int now, int lim) {
    int x = a[now], y = a[now];
    for (int i = Log[n - now + 1]; i >= 0 && now <= n; i--)
      if ((now + (1 << i) - 1 <= n) &&
          Max(x, mx[i][now]) - Min(y, mn[i][now]) <= lim) {
        x = Max(x, mx[i][now]), y = Min(y, mn[i][now]);
        now += (1 << i);
      }
    return now;
  }
} rmq;
struct Node {
  int id, k;
} q[N];
inline bool cmp(Node a, Node b) { return a.k < b.k; }
inline int query(int lim) {
  int now = 1, cnt = 0;
  while (now <= n) {
    T.Access(now);
    T.Splay(now);
    cnt += T.size[now] - 1;
    now = T.find(now);
    if (now != n + 1) ++cnt, now = rmq.Next(now, lim);
  }
  return cnt;
}
int main() {
  n = read(), w = read(), Q = read();
  for (int i = 1; i <= n; i++) a[i] = read();
  rmq.build();
  for (int i = 1; i <= Q; i++) q[i].id = i, q[i].k = w - read();
  sort(q + 1, q + Q + 1, cmp);
  for (int i = n; i >= 1; i--) T.fa[i] = i + 1, T.size[i] = 1;
  B = 200;
  for (int i = 1; i <= n; i++) {
    int x = a[i], y = a[i];
    for (int j = 1; j <= B && i + j <= n; j++) {
      x = Max(x, a[i + j]), y = Min(y, a[i + j]);
      det.push_back(make_pair(x - y, i));
    }
  }
  sort(det.begin(), det.end());
  for (int i = 1; i <= Q; i++) {
    modify(q[i].k);
    Ans[q[i].id] = query(q[i].k) - 1;
  }
  for (int i = 1; i <= Q; ++i) printf("%d\n", Ans[i]);
  return 0;
}
