#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;
}
struct Splay {
  struct node {
    int c[2], siz, fa, tag;
    node() { c[0] = c[1] = siz = fa = tag = 0; }
  } t[101000];
  int s[101000];
  bool isroot(int x) { return t[t[x].fa].c[0] != x && t[t[x].fa].c[1] != x; }
  void flip(int x) { swap(t[x].c[0], t[x].c[1]), t[x].tag ^= 1; }
  void push_up(int x) { t[x].siz = t[t[x].c[0]].siz + t[t[x].c[1]].siz + 1; }
  void push_down(int x) {
    if (t[x].tag)
      for (int i = (0); i <= (1); i++)
        if (t[x].c[i]) flip(t[x].c[i]);
    t[x].tag = 0;
  }
  void rotate(int x) {
    int y = t[x].fa, z = t[y].fa;
    int dir1 = (t[y].c[1] == x), dir2 = (t[z].c[1] == y);
    if (!isroot(y)) t[z].c[dir2] = x;
    t[x].fa = z;
    int son = t[x].c[dir1 ^ 1];
    t[y].c[dir1] = son, t[son].fa = (son ? y : 0);
    t[x].c[dir1 ^ 1] = y, t[y].fa = x;
    push_up(y);
  }
  void splay(int x) {
    int y, z, tmp = x, top = 0;
    while (!isroot(tmp)) s[++top] = tmp, tmp = t[tmp].fa;
    s[++top] = tmp;
    while (top) push_down(s[top--]);
    while (!isroot(x)) {
      y = t[x].fa, z = t[y].fa;
      if (!isroot(y)) rotate((t[y].c[0] == x) ^ (t[z].c[0] == y) ? x : y);
      rotate(x);
    }
    push_up(x);
  }
};
struct Link_Cut_Tree {
  Splay S;
  void access(int x) {
    for (int y = 0; x; x = S.t[y = x].fa)
      S.splay(x), S.t[x].c[1] = y, S.push_up(x);
  }
  void make_root(int x) { access(x), S.splay(x), S.flip(x); }
  int find_root(int x) {
    access(x), S.splay(x);
    while (S.t[x].c[0]) S.push_down(x), x = S.t[x].c[0];
    S.splay(x);
    return x;
  }
  void split(int x, int y) { make_root(x), access(y), S.splay(y); }
  void link(int x, int y) { access(x), S.t[x].fa = y; }
  void cut(int x, int y) {
    access(x), S.splay(y);
    if (S.t[x].fa == y && S.t[y].c[1] == x)
      S.t[x].fa = S.t[y].c[1] = 0, S.push_up(y);
  }
} LCT;
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++) {
    LCT.link(i, i + 1), nxt[i] = i + 1;
    mn[i] = mx[i] = a[i];
    extend[lower_bound(ask + 1, ask + qy + 2,
                       make_pair(abs(a[i + 1] - a[i]), 0)) -
           ask]
        .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++;
      LCT.cut(i, nxt[i]);
      nxt[i] = j;
      if (j < i + 317) {
        LCT.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 = LCT.find_root(i);
      tot += LCT.S.t[j].siz - 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;
}
