#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll L = 17;
const ll N = 1 << 17;
const ll INF = 3e9;
void timeAssert(bool c) {
  while (!c) {
  }
}
struct query {
  ll len, ind;
};
ll n, w, q;
ll first[N];
ll a[N];
vector<pair<ll, ll>> queries;
ll k;
ll tmin[2 * N], tmax[2 * N];
ll mn, mx;
ll minmax(ll l, ll r) {
  mn = +INF;
  mx = -INF;
  for (l += N, r += N; l <= r; l /= 2, r /= 2) {
    if (l % 2 == 1) {
      mn = min(mn, tmin[l]);
      mx = max(mx, tmax[l]);
      ++l;
    }
    if (r % 2 == 0) {
      mn = min(mn, tmin[r]);
      mx = max(mx, tmax[r]);
      --r;
    }
  }
  timeAssert(mn <= mx);
  return mx - mn;
}
ll _query(ll v, ll vl, ll vr, ll pos) {
  if (vr - 1 < pos || (pos <= vl && max(mx, tmax[v]) - min(mn, tmin[v]) <= k)) {
    if (pos <= vl) {
      mn = min(mn, tmin[v]);
      mx = max(mx, tmax[v]);
    }
    return -1;
  }
  if (v >= N) {
    timeAssert(v - N > pos);
    return v - N;
  }
  ll vm = (vl + vr) / 2;
  ll lef = _query(v + v, vl, vm, pos);
  if (lef != -1) {
    return lef;
  }
  return _query(v + v + 1, vm, vr, pos);
}
ll jump(ll i) {
  mn = mx = first[i];
  ll res = _query(1, 0, N, i);
  timeAssert(res != -1);
  return res;
}
ll up[N][L];
ll nx[N][L];
void prepare(ll v, ll i) {
  if (nx[v][i] > k) {
    return;
  }
  if (!i) {
    up[v][i] = jump(v);
    nx[v][i] = minmax(v, up[v][i]);
    return;
  }
  prepare(v, i - 1);
  ll t = up[v][i - 1];
  if (t == n) {
    up[v][i] = up[v][i - 1];
    nx[v][i] = nx[v][i - 1];
    return;
  }
  prepare(t, i - 1);
  up[v][i] = up[t][i - 1];
  nx[v][i] = min(nx[v][i - 1], nx[t][i - 1]);
}
ll sim() {
  ll ans = 0;
  ll v = 0;
  for (ll i = L - 1; i >= 0; --i) {
    prepare(v, i);
    ll u = up[v][i];
    if (u == n) {
      continue;
    }
    ans += 1 << i;
    v = up[v][i];
  }
  prepare(v, 0);
  assert(up[v][0] == n);
  return ans + 1;
}
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> w >> q;
  for (ll i = 0; i < n; ++i) {
    cin >> first[i];
  }
  first[n] = INF;
  copy_n(first, N, tmin + N);
  copy_n(first, N, tmax + N);
  for (ll i = N - 1; i > 0; --i) {
    tmin[i] = min(tmin[i + i], tmin[i + i + 1]);
    tmax[i] = max(tmax[i + i], tmax[i + i + 1]);
  }
  for (ll i = 0; i < q && cin >> k; ++i) {
    queries.emplace_back(w - k, n + i);
  }
  sort(queries.begin(), queries.end());
  for (auto e : queries) {
    k = e.first;
    a[e.second - n] = sim();
  }
  for (ll i = 0; i < q; ++i) {
    cout << a[i] - 1 << "\n";
  }
  return 0;
}
