#include <bits/stdc++.h>
using namespace std;
#define int long long
vector<int> t;
vector<pair<int, int>> t1;
vector<int> d;
int get(int idx){
auto it = lower_bound(d.begin(), d.end(), idx) - d.begin();
return it;
}
void update(int i, int l, int r, int l1, int r1, int v){
if(l1 > r || l > r1) return;
if(t1[i].first == -1){
t[i] = 0;
t1[i*2].first = -1;
t1[i*2].second = 0;
t1[i*2+1].first = -1;
t1[i*2+1].second = 0;
t1[i].first = 0;
t[i*2] = 0;
t[i*2+1] = 0;
}
if(t1[i].second > 0){
t[i] = max(t[i], t1[i].second);
t1[i*2].second = max(t1[i*2].second, t1[i].second);
t1[i*2+1].second = max(t1[i*2+1].second, t1[i].second);
t1[i].second = 0;
}
if(l1 <= l && r1 >= r){
if(v == -1){
t[i] = 0;
t1[i*2].first = -1;
t1[i*2+1].first = -1;
t1[i*2].second = 0;
t1[i*2+1].second = 0;
t[i*2] = 0;
t[i*2+1] = 0;
return;
}
t[i] = max(t[i], v);
t1[i*2].second = max(t1[i*2].second, v);
t1[i*2+1].second = max(t1[i*2+1].second, v);
return;
}
int mid = (l+r)/2;
update(i*2, l, mid, l1, r1, v);
update(i*2+1, mid+1, r, l1, r1, v);
t[i] = max(t[i*2], t[i*2+1]);
}
int query(int i, int l, int r, int l1, int r1){
if(l > r1 || l1 > r) return 0;
if(t1[i].first == -1){
t[i] = 0;
t1[i*2].first = -1;
t1[i*2].second = 0;
t1[i*2+1].first = -1;
t1[i*2+1].second = 0;
t1[i].first = 0;
t[i*2] = 0;
t[i*2+1] = 0;
}
if(t1[i].second > 0){
t[i] = max(t[i], t1[i].second);
t1[i*2].second = max(t1[i*2].second, t1[i].second);
t1[i*2+1].second = max(t1[i*2+1].second, t1[i].second);
t1[i].second = 0;
}
if(l1 <= l && r1 >= r){
return t[i];
}
int mid = (l+r)/2;
return max(query(i*2, l, mid, l1, r1), query(i*2+1, mid+1, r, l1, r1));
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, dis; cin >> n >> dis;
vector<int> a(n);
for(int i = 0; i < n; i++){
cin >> a[i];
}
d = a;
sort(d.begin(), d.end());
d.erase(unique(d.begin(), d.end()), d.end());
t.resize(8*d.size());
t1.resize(8*d.size());
multiset<int> s;
for(int i = 0; i < n; i++){
// cout << i << endl;
int j = 0;
if(a[i] == d[0]){
j = 1;
}else{
j = query(1, 0, d.size()-1, 0, get(a[i])-1)+1;
}
// cout << j << " ";
update(1, 0, d.size()-1, get(a[i]), get(a[i]), j);
s.insert(a[i]);
if(i-dis >= 0){
s.erase(s.find(a[i-dis]));
}
int mn = *s.begin();
// cout << mn << " ";
if(mn != d[0]){
update(1, 0, d.size()-1, 0, get(mn)-1, -1);
}
}
// cout << "\n";
cout << query(1, 0, d.size()-1, 0, d.size()-1) << "\n";
return 0;
}