#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
template <typename T>
struct SegTree {
  using F = function<T(T, T)>;
  int size;
  vector<T> dat;
  const F f;
  const T INIT;
  SegTree(int n, const F func, const T &init) : f(func), INIT(init) {
    size = 1;
    while (size < n) size <<= 1;
    dat.assign(2 * size, INIT);
  }
  void update(int k, const T &x) {
    k += size;
    dat[k] = x;
    while (k >>= 1) {
      dat[k] = f(dat[2 * k], dat[2 * k + 1]);
    }
  }
  T query(int a, int b) {
    T l = INIT, r = INIT;
    for (a += size, b += size + 1; a < b; a >>= 1, b >>= 1) {
      if (a & 1) l = f(l, dat[a++]);
      if (b & 1) r = f(r, dat[--b]);
    }
    return f(l, r);
  }
  void set(int k, const T &x) { dat[k + size] = x; }
  void build() {
    for (int k = size - 1; k > 0; k--) {
      dat[k] = f(dat[2 * k], dat[2 * k + 1]);
    }
  }
  T operator[](const int &k) const { return dat[k + size]; }
};
int main(void) {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int n, k;
  cin >> n >> k;
  SegTree<int> seg(
      n, [](int a, int b) { return max(a, b); }, 0);
  int ans = 0;
  for (int _ = (0); _ < (n); _++) {
    int a;
    cin >> a;
    a--;
    int p = seg.query(max(0, a - k), min(n, a + k)) + 1;
    ans = max(ans, p);
  }
  cout << ans << '\n';
  return 0;
}
