#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0; i<(int)(n); i++)
#define REP(i,a,b) for(int i=(int)(a); i<(int)(b); i++)

using ll = long long;

int op(int a, int b){return max(a,b);}
int e(){return 0;}
const int MAX_A = 300005;
#include <atcoder/all>
using namespace atcoder;

int main(){
  int N,K;
  cin >> N >> K;
  vector<int> A(N);
  rep(i,N){cin >> A[i];}

  // Aをi番目まで見た時の最後の数字がjである時のBの長さをdp[i][j]に格納(解説放送より)
    /* dp遷移は
      dp[i][j] = dp[i-1][j] <選ばない場合>
      dp[i][Ai] = max(dp[i-1][Ai-K~Ai+K]) + 1 <選ぶ>

      ただこのままだとdp配列が確保できないのでiを消去
      <選ばない場合>はdp[j]の基本変化なし
      dp[Ai] = max(dp[Ai], max(dp[Ai-K ~ Ai+K]) <選ぶ>

      maxdpの部分では区間の最大値を取るのでO(NK)になり間に合わない
       → segtreeを使用(解説略された…)(蟻本)
    */
  
  // 以下、解説放送の写経 // 上記のop,e,MAX_A及びatcoderライブラリも含む

  segtree<int, op, e> dp(MAX_A);
  // op … 加算などの演算を表す　
  // e … 上記演算における単位元
  rep(i,N){
    int x = a[i];
    int l = x-K, r = x+K+1;// prodの範囲は半開区間なのでrには+1が必要
    l = max(l,0); r = min(r,MAX_A);
    int now = dp.prod(l,r) + 1;
    dp.set(x, now);
  }
  int ans = dp.prod(0,MAX_A);
  cout << ans << endl;
}


/*
サンプルでは貪欲でイケるけど貪欲で取るとだめな例がある
(ex)K=3のとき(1,4,0,0,0,0,0,0)など

取る場合と取らない場合を両方考慮する必要があるのでdpっぽい
ぽいけど…最長共通部分列問題と違って保持する最後の数字が変化する・複数の可能性があるから実装がわからん…

ので解説放送をみた！dpは合ってたけど二次元dpっぽい

ACLという競プロライブラリ実装記念のコンテストなので
想定解はライブラリ使って殴ることらしい。(が、わからん)
*/