#include<bits/stdc++.h>
#include <atcoder/all>
#define ll long long int
#define rep(i,n) for(ll i=0;i<n;i++)
#define vec vector<ll>
#define mat vector<vector<ll>>

using namespace std;
using namespace atcoder;

const ll mod=998244353;
const ll inf=LONG_LONG_MAX;
ll dx4[4]={1,0,-1,0};
ll dy4[4]={0,-1,0,1};
ll dx8[8]={1,0,-1,1,-1,1,0,-1};
ll dy8[8]={1,1,1,0,0,-1,-1,-1};

ll op(ll a,ll b) {
    return max(a, b);
}

ll e() {
    return 0;
}

int main(){

  ll n,k;
  cin >> n >> k;
  mat G;
  vec d(n);
  for(ll i=0;i<n;i++){
    ll a;
    cin >> a;
    d[i]=a;
    G.push_back({a,i});
  }

  sort(G.begin(),G.end());
  vec b(n);//a[i]がGのどこにあるか
  for(ll i=0;i<n;i++)b[G[i][1]]=i;

  vec c(n);
  for(ll i=0;i<n;i++)c[i]=G[i][0];


  segtree<ll, op, e> seg(n);

  seg.set(b[0],1);
  for(ll i=1;i<n;i++){
    ll p=lower_bound(c.begin(),c.end(),d[i]-k)-c.begin();
    ll q=upper_bound(c.begin(),c.end(),d[i]+k)-c.begin()-1;
    ll e=seg.prod(p,q+1);

    seg.set(b[i],e+1);
  }

  //for(ll i=0;i<n;i++)cout << seg.get(b[i]) << endl;
  cout << seg.get(b[n-1]) << endl;
  


  return 0;
}