#include <bits/stdc++.h>
using namespace std;
inline int gi() {
  int x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = (x << 3) + (x << 1) + ch - 48;
    ch = getchar();
  }
  return x * f;
}
const int N = 1e5 + 7;
int n, w, Q, sz;
int x[N], nxt[N], mi[N][20], mx[N][20], Log[N], ans[N];
struct qs {
  int k, id;
  bool operator<(const qs &rhs) const { return k < rhs.k; }
} q[N];
int fa[N], tr[N][2], son[N], rev[N];
bool isrt(int o) { return tr[fa[o]][0] ^ o && tr[fa[o]][1] ^ o; }
int side(int o) { return tr[fa[o]][1] == o; }
void pushup(int o) { son[o] = son[tr[o][0]] + son[tr[o][1]] + 1; }
void rotate(int o) {
  int f = fa[o], y = fa[fa[o]], x = side(o), s = tr[o][x ^ 1];
  if (!isrt(f)) tr[y][side(f)] = o;
  fa[o] = y;
  tr[f][x] = s, fa[s] = f;
  tr[o][x ^ 1] = f, fa[f] = o;
  pushup(f), pushup(o);
}
void splay(int o) {
  for (; !isrt(o); rotate(o))
    if (!isrt(fa[o])) rotate(side(o) == side(fa[o]) ? fa[o] : o);
}
void access(int o) {
  for (int y = 0; o; y = o, o = fa[o]) splay(o), tr[o][1] = y, pushup(o);
}
void link(int a, int b) {
  access(a), splay(a);
  fa[a] = b;
}
void cut(int a, int b) {
  access(a), splay(a);
  int x = tr[a][0];
  fa[x] = tr[a][0] = 0;
  pushup(a);
}
int dep(int o) {
  access(o);
  splay(o);
  return son[o];
}
int findr(int o) {
  access(o);
  splay(o);
  while (tr[o][0]) o = tr[o][0];
  return o;
}
vector<int> G[N];
int qmx(int l, int r) {
  int k = Log[r - l + 1];
  return max(mx[l][k], mx[r - (1 << k) + 1][k]);
}
int qmi(int l, int r) {
  int k = Log[r - l + 1];
  return min(mi[l][k], mi[r - (1 << k) + 1][k]);
}
int main() {
  n = gi(), w = gi(), Q = gi();
  sz = sqrt(n);
  for (int i = 1; i <= n; ++i) x[i] = mi[i][0] = mx[i][0] = gi();
  x[n + 1] = mi[n + 1][0] = mx[n + 1][0] = 2e9 + 1;
  Log[1] = 0;
  for (int i = 2; i <= n + 1; ++i) Log[i] = Log[i >> 1] + 1;
  for (int k = 1; 1 << k <= n + 1; ++k)
    for (int i = 1; i + (1 << k) - 1 <= n + 1; ++i) {
      mi[i][k] = min(mi[i][k - 1], mi[i + (1 << k - 1)][k - 1]);
      mx[i][k] = max(mx[i][k - 1], mx[i + (1 << k - 1)][k - 1]);
    }
  for (int i = 1; i <= Q; ++i) {
    q[i].id = i, q[i].k = w - gi();
  }
  sort(q + 1, q + 1 + Q);
  for (int i = 1; i <= n + 1; ++i) son[i] = 1;
  for (int i = 1; i <= n; ++i) nxt[i] = i, G[1].push_back(i);
  for (int i = 1; i <= Q; ++i) {
    for (auto p : G[i]) {
      if (i != 1) cut(p, nxt[p]);
      int j = nxt[p] + 1;
      for (; j <= min(p + sz, n + 1); ++j)
        if (qmx(p, j) - qmi(p, j) > q[i].k) break;
      if (j == p + sz + 1) continue;
      nxt[p] = j, link(p, j);
      int x = lower_bound(q + 1, q + 1 + Q,
                          (qs){qmx(p, nxt[p]) - qmi(p, nxt[p]), 0}) -
              q;
      if (x != Q + 1) G[x].push_back(p);
    }
    int &res = ans[q[i].id];
    for (int j = 1; j <= n + 1;) {
      res += dep(j), j = findr(j);
      if (j == n + 1) break;
      int l = j + 1, r = n + 1;
      while (l < r) {
        int mid = l + r >> 1;
        if (qmx(j, mid) - qmi(j, mid) > q[i].k)
          r = mid;
        else
          l = mid + 1;
      }
      j = l;
    }
  }
  for (int i = 1; i <= Q; ++i) printf("%d\n", ans[i] - 2);
  return 0;
}
