#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x) {
  x = 0;
  char c = getchar();
  bool flag = false;
  while (!isdigit(c)) {
    if (c == '-') flag = true;
    c = getchar();
  }
  while (isdigit(c)) {
    x = (x << 1) + (x << 3) + (c ^ 48);
    c = getchar();
  }
  if (flag) x = -x;
}
int n, w, q, S;
int ans[200010], mx[18][200010], mn[18][200010], lg[200010], nxt[200010],
    fa[200010], ch[200010][2], siz[200010];
pair<int, int> t[200010];
vector<int> ve[200010];
void ST() {
  lg[0] = -1;
  for (int i = 1; i <= n + 1; ++i) lg[i] = lg[i >> 1] + 1;
  for (int j = 1; j <= 16; ++j)
    for (int i = 1; i + (1 << j) - 1 <= n + 1; ++i)
      mx[j][i] = max(mx[j - 1][i], mx[j - 1][i + (1 << (j - 1))]),
      mn[j][i] = min(mn[j - 1][i], mn[j - 1][i + (1 << (j - 1))]);
}
int ask(int l, int r) {
  int len = lg[r - l + 1];
  return max(mx[len][l], mx[len][r - (1 << len) + 1]) -
         min(mn[len][l], mn[len][r - (1 << len) + 1]);
}
bool check(int x) { return ch[fa[x]][1] == x; }
bool notroot(int x) { return ch[fa[x]][0] == x || ch[fa[x]][1] == x; }
void pushup(int x) { siz[x] = siz[ch[x][0]] + siz[ch[x][1]] + 1; }
void rotate(int x) {
  int y = fa[x], z = fa[y], k = check(x), w = ch[x][k ^ 1];
  if (notroot(y)) ch[z][check(y)] = x;
  ch[x][k ^ 1] = y, ch[y][k] = w;
  if (w) fa[w] = y;
  fa[x] = z, fa[y] = x;
  pushup(y), pushup(x);
}
void splay(int x) {
  for (int y; notroot(x); rotate(x))
    if (notroot(y = fa[x])) rotate(check(x) ^ check(y) ? x : y);
  pushup(x);
}
void access(int x) {
  for (int y = 0; x; y = x, x = fa[x]) splay(x), ch[x][1] = y, pushup(x);
}
int findroot(int x) {
  access(x), splay(x);
  while (ch[x][0]) x = ch[x][0];
  splay(x);
  return x;
}
void link(int x, int y) { access(x), splay(x), fa[x] = y; }
void cut(int x) { access(x), splay(x), ch[x][0] = fa[ch[x][0]] = 0; }
int query(int x) {
  access(x), splay(x);
  return siz[x];
}
int main() {
  read(n), read(w), read(q), S = sqrt(n);
  for (int i = 1; i <= n; ++i)
    read(mx[0][i]), mn[0][i] = mx[0][i], nxt[i] = i, ve[1].push_back(i),
                    link(i, i + 1);
  mx[0][n + 1] = mn[0][n + 1] = 2000000010, ST();
  for (int i = 1; i <= q; ++i)
    read(t[i].first), t[i].first = w - t[i].first, t[i].second = i;
  sort(t + 1, t + q + 1);
  for (int i = 1; i <= q; ++i) {
    int val = t[i].first, x;
    for (int j = 0; j < ve[i].size(); ++j) {
      int p = ve[i][j];
      cut(p), x = nxt[p] + 1;
      while (x <= min(p + S, n + 1) && ask(p, x) <= val) x++;
      if (x == p + S + 1) continue;
      link(p, nxt[p] = x),
          ve[lower_bound(t + 1, t + q + 1, make_pair(ask(p, x), 0)) - t]
              .push_back(p);
    }
    x = 1;
    while (x <= n + 1) {
      ans[t[i].second] += query(x), x = findroot(x);
      int l = x, r = n + 1, p = x;
      while (l <= r) {
        int mid = (l + r) >> 1;
        if (ask(x, mid) <= val)
          l = mid + 1, p = mid;
        else
          r = mid - 1;
      }
      x = p + 1;
    }
  }
  for (int i = 1; i <= q; ++i) printf("%d\n", ans[i] - 2);
  return 0;
}
