#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target( \
    "sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
#pragma GCC optimize("inline", "fast-math", "unroll-loops", \
                     "no-stack-protector")
using namespace std;
inline int read() {
  int s = 0, w = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') w = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9')
    s = (s << 3) + (s << 1) + (ch ^ 48), ch = getchar();
  return s * w;
}
int ch[101000][2], siz[101000], rev[101000], fa[101000];
void update(int x) { siz[x] = siz[ch[x][0]] + siz[ch[x][1]] + 1; }
void pushr(int x) { swap(ch[x][0], ch[x][1]), rev[x] ^= 1; }
void pushdown(int x) {
  if (rev[x]) {
    if (ch[x][0]) pushr(ch[x][0]);
    if (ch[x][1]) pushr(ch[x][1]);
    rev[x] = 0;
  }
}
int nroot(int x) { return ch[fa[x]][0] == x || ch[fa[x]][1] == x; }
int get(int x) { return ch[fa[x]][1] == x; }
void rotate(int x) {
  int f = fa[x], gf = fa[f], k = get(x);
  if (nroot(f)) ch[gf][get(f)] = x;
  fa[x] = gf;
  if (ch[x][!k]) fa[ch[x][!k]] = f;
  ch[f][k] = ch[x][!k];
  ch[x][!k] = f, fa[f] = x;
  update(f), update(x);
}
int sta[101000];
void splay(int x) {
  int now = x, top = 0;
  sta[++top] = now;
  while (nroot(now)) sta[++top] = now = fa[now];
  while (top) pushdown(sta[top--]);
  while (nroot(x)) {
    int f = fa[x];
    if (nroot(f)) rotate(get(x) == get(f) ? f : x);
    rotate(x);
  }
  update(x);
}
void access(int x) {
  for (int y = 0; x; x = fa[y = x]) splay(x), ch[x][1] = y, pushdown(x);
}
int getroot(int x) {
  access(x), splay(x);
  for (; ch[x][0];) pushdown(x), x = ch[x][0];
  splay(x);
  return x;
}
void link(int x, int y) {
  access(x);
  fa[x] = y;
}
void cut(int x, int y) {
  access(x), splay(y);
  fa[x] = ch[y][1] = 0;
  update(y);
}
int a[101000], ans[101000];
pair<int, int> ask[101000];
int n, w, qy;
int nxt[101000], mn[101000], mx[101000];
int stmin[101000][18], stmax[101000][18], Log[1 << 18];
vector<int> extend[101000];
void init() {
  for (int i = (n + 1); i >= (1); i--) {
    stmin[i][0] = stmax[i][0] = a[i];
    for (int p = (1); p <= (18 - 1); p++)
      if (i + (1 << p) <= n + 2) {
        stmin[i][p] = min(stmin[i][p - 1], stmin[i + (1 << (p - 1))][p - 1]);
        stmax[i][p] = max(stmax[i][p - 1], stmax[i + (1 << (p - 1))][p - 1]);
      }
  }
  for (int i = (0); i <= (18 - 1); i++) Log[1 << i] = i;
  for (int i = (2); i <= (n); i++)
    if (!Log[i]) Log[i] = Log[i - 1];
}
int diff(int l, int r) {
  int p = Log[r - l + 1];
  return max(stmax[l][p], stmax[r - (1 << p) + 1][p]) -
         min(stmin[l][p], stmin[r - (1 << p) + 1][p]);
}
int dis(int i, int j) { return max(abs(mx[i] - a[j]), abs(mn[i] - a[j])); }
bool check(int i, int j, int d) {
  if (dis(i, j) > d) return false;
  mx[i] = max(mx[i], a[j]), mn[i] = min(mn[i], a[j]);
  return true;
}
int main() {
  n = read(), w = read(), qy = read();
  for (int i = (1); i <= (n); i++) a[i] = read();
  a[n + 1] = 0x3f3f3f3f, init();
  for (int i = (1); i <= (qy); i++) ask[i] = {w - read(), i};
  ask[qy + 1] = {0x3f3f3f3f, 0};
  sort(ask + 1, ask + 1 + qy);
  for (int i = (1); i <= (n); i++) {
    link(i, i + 1), nxt[i] = i + 1;
    mn[i] = mx[i] = a[i];
    extend[1].push_back(i);
  }
  for (int p = (1); p <= (qy); p++) {
    int d = ask[p].first;
    for (int i : extend[p]) {
      int j = nxt[i];
      while (j <= n && j < i + 317 && check(i, j, d)) j++;
      cut(i, nxt[i]);
      nxt[i] = j;
      if (j < i + 317) {
        link(i, nxt[i]);
        extend[lower_bound(ask + p + 1, ask + qy + 2, make_pair(dis(i, j), 0)) -
               ask]
            .push_back(i);
      }
    }
    int i = 1, tot = 0;
    while (i <= n) {
      int j = getroot(i);
      tot += siz[j] - 1, i = j;
      if (j == n + 1) break;
      for (int p = (18 - 1); p >= (0); p--)
        if (j + (1 << p) <= n + 1)
          if (diff(i, j + (1 << p)) <= d) j += (1 << p);
      i = j + 1, tot++;
    }
    ans[ask[p].second] = tot - 1;
  }
  for (int i = (1); i <= (qy); i++) printf("%d\n", ans[i]);
  return 0;
}
