#include <bits/stdc++.h>
using namespace std;
#define faster ios_base::sync_with_stdio(false); cin.tie(NULL)
#define Bit(mask , i) ((mask >> i) & 1)
#define fi first
#define se second
#define _LOG2(nl) 31 - __builtin_clz(nl)
#define c_bit(nl) __builtin_popcount(nl)
#define ii pair<int , pair<int , int>>
#define lii pair<long long , pair<int , int>>
#define iii pair<int , pair<int , int>>
#define li pair<long long , long long>
#define db long double
#define onBit(mask , i) (mask | (1 << i))
#define offBit(mask , i) (mask & (~(1 << i)))
#define ill pair<int , pair<long long , long long>>
#define lli pair<pair<long long , long long> , pair<int , int>>
const long long MOD = 1e9 + 7;
const int N = 3e5 + 7;
int n , d;
int par[N] , mn[N] , t[4 * N];
struct gv{
long long val;
int id;
};
gv a[N];
bool cmp(gv x , gv y){
if (x.val != y.val) return x.val < y.val;
return x.id > y.id;
}
void inp(){
cin >> n >> d;
for (int i = 1 ; i <= n ; ++i){
cin >> a[i].val;
a[i].id = i;
}
sort(a + 1 , a + n + 1 , cmp);
for (int i = 1 ; i <= n ; ++i){
par[i] = i;
mn[i] = i;
}
}
int find_par(int u){
if (u == par[u]) return u;
return find_par(par[u]);
}
void Union(int u , int v){
u = find_par(u) , v = find_par(v);
if (u == v) return;
par[v] = u;
mn[u] = min(mn[u] , mn[v]);
}
void update(int id , int l , int r , int pos , int val){
if (l > pos || r < pos) return;
if (l == r){
t[id] = val;
return;
}
int mid = (l + r) >> 1;
update(id << 1 , l , mid , pos , val);
update(id << 1 | 1 , mid + 1 , r , pos , val);
t[id] = max(t[id << 1] , t[id << 1 | 1]);
}
int get(int id , int l , int r , int u , int v){
if (u > v) return 0;
if (l > v || r < u) return 0;
if (u <= l && r <= v) return t[id];
int mid = (l + r) >> 1;
int t1 = get(id << 1 , l , mid , u , v);
int t2 = get(id << 1 | 1 , mid + 1 , r , u , v);
return max(t1 , t2);
}
void solve(){
set<int> s;
int res = 0;
for (int i = 1 ; i <= n ; ++i){
auto it = s.lower_bound(a[i].id);
if (it != s.end()){
if (abs(*it - a[i].id) <= d) Union(*it , a[i].id);
}
if (it != s.begin()){
--it;
if (abs(*it - a[i].id) <= d) Union(*it , a[i].id);
}
s.insert(a[i].id);
int st = mn[find_par(a[i].id)];
int tmp = get(1 , 1 , n , st , a[i].id - 1) + 1;
res = max(res , tmp);
update(1 , 1 , n , a[i].id , tmp);
}
cout << res;
}
int main(){
// freopen("pine.inp" , "r" , stdin);
// freopen("pine.out" , "w" , stdout);
faster;
inp();
solve();
return 0;
}