#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
const long long mod2 = 998244353;
const long long N = 3e5;
const long long inf = 1e18;
template <typename... T>
void read(T&... args) {
  ((cin >> args), ...);
}
template <typename... T>
void write(T&&... args) {
  ((cout << args << " "), ...);
}
template <typename... T>
void writeline(T&&... args) {
  ((cout << args << " "), ...);
  cout << endl;
}
long long add(long long a, long long b) {
  long long res = (a + b) % mod;
  return (res < 0) ? res + mod : res;
}
long long mul(long long a, long long b) {
  long long res = (a * 1LL * b) % mod;
  return (res < 0) ? res + mod : res;
}
string binary(long long x) {
  string res = "";
  for (long long i = 0; i < 32; i++) res += (1 << i & x) ? '1' : '0';
  return res;
}
long long in(long long x, long long y, long long z) {
  if (y > z) swap(y, z);
  return (x >= y && x <= z);
}
struct customCompare {
  bool operator()(pair<long long, long long> x, pair<long long, long long> y) {
    return x.first > y.second;
  }
};
long long tree[10000000];
long long a[300005];
void pointUpdate(long long i, long long j, long long k, long long l,
                 long long val) {
  if (i > l || j < l) return;
  if (i == j) {
    tree[k] = a[l] = val;
    return;
  }
  long long mid = (i + j) / 2;
  pointUpdate(i, mid, 2 * k, l, val);
  pointUpdate(mid + 1, j, 2 * k + 1, l, val);
  tree[k] = max(tree[2 * k], tree[2 * k + 1]);
}
long long query(long long i, long long j, long long l, long long r,
                long long k) {
  if (i > r || j < l) return 0;
  if (i >= l && j <= r) return tree[k];
  long long mid = (i + j) / 2;
  return max(query(i, mid, l, r, 2 * k), query(mid + 1, j, l, r, 2 * k + 1));
}
void solve() {
  long long n, k;
  cin >> n >> k;
  long long b[n];
  for (long long i = 0; i < n; i++) cin >> b[i];
  long long mx = *max_element(b, b + n);
  long long ans = 0;
  for (long long i = 0; i < n; i++) {
    long long l = max(1LL, b[i] - k);
    long long r = min(mx, b[i] + k);
    long long q = query(1, mx, l, r, 1);
    pointUpdate(1, mx, 1, b[i], q + 1);
    ans = max(ans, q + 1);
  }
  cout << ans;
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  solve();
  return 0;
}
