#include <bits/stdc++.h>
using namespace std;
long long int power(long long int x, long long int y, long long int p) {
  long long int res = 1;
  x = x % p;
  if (x == 0) return 0;
  while (y > 0) {
    if (y & 1) res = (res * x) % p;
    y = y >> 1;
    x = (x * x) % p;
  }
  return res;
}
long long int op(long long int a, long long int b) { return max(a, b); }
long long int n, m, a[300005], t[4 * 300005];
void crt(long long int node, long long int s, long long int e) {
  if (s == e)
    t[node] = a[s];
  else {
    long long int mid = (s + e) / 2;
    crt(2 * node, s, mid);
    crt(2 * node + 1, mid + 1, e);
    t[node] = op(t[2 * node], t[2 * node + 1]);
  }
}
void update(long long int node, long long int i, long long int s,
            long long int e) {
  if (s == e) {
    t[node] = a[i];
  } else {
    long long int mid = (s + e) / 2;
    if (s <= i && i <= mid)
      update(2 * node, i, s, mid);
    else
      update(2 * node + 1, i, mid + 1, e);
    t[node] = op(t[2 * node], t[2 * node + 1]);
  }
}
long long int query(long long int node, long long int l, long long int r,
                    long long int s, long long int e) {
  if (l > e || r < s) return 0;
  if (l <= s && e <= r) return t[node];
  long long int mid = (s + e) / 2;
  long long int p1 = query(2 * node, l, r, s, mid);
  long long int p2 = query(2 * node + 1, l, r, mid + 1, e);
  return op(p1, p2);
}
int32_t main() {
  ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
  long long int n, x, k, ans = 1;
  cin >> n >> k;
  for (long long int i = 1; i <= n; i++) {
    cin >> x;
    long long int l = max(0LL, x - k);
    long long int r = min(300002LL, x + k);
    long long int y = query(1, l, r, 1, n);
    a[x] = max(a[x], y + 1);
    ans = max(ans, a[x]);
    update(1, x, 1, n);
  }
  cout << ans;
}
