#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define ins insert
#define lb lower_bound
#define F first
#define S second
#define int long long
#define pii pair<int, int>
#define sz size()
#define in insert
#define len(x) (int)x.size()
#define all(v) v.begin(),v.end()
#define FOR(x, n, m, d) for(int x = n; x <= m; x += d)
#define FORR(x, n, m, d) for(int x = n; x >= m; x -= d)
#define nikita ios_base::sync_with_stdio(0), cin.tie(0);
const int N = 2e5 + 15;
int n, m, x, y, l, r, k, P = 7, mod = 1e9+7, ans, sum, cnt, a[N], timer = 1, c[N];
int d[N*6], t[N*6], sp[N][21];
int get(int l, int r){
int k = log2(r-l+1);
return min(sp[l][k], sp[r- (1 << k) + 1][k]);
}
void push(int v, int l, int r){
if(d[v]==-1)return;
if(l!=r)d[v*2] = d[v*2+1] = d[v];
t[v] = d[v];d[v] = -1;
}
void upd(int l, int r, int val, int v = 1, int tl = 1, int tr = n){
push(v, tl, tr);
if(l==r&&tl==tr && val && l == tl){
t[v] = max(t[v], val);
return;
}
if(l <= tl && tr <= r){
d[v]=val;
push(v, tl, tr);
return;
}
if(l > tr || tl > r)return;
int tm = (tl + tr) >> 1;
upd(l, r, val, v*2, tl, tm), upd(l, r, val, v*2+1, tm+1, tr);
t[v] = max(t[v*2], t[v*2+1]);
}
int get1(int r, int v = 1, int tl =1 , int tr = n){
if(r >= tr)return t[v];
if(r < tl)return 0;
int tm = (tl + tr) >> 1;
return max(get1(r, v*2, tl, tm), get1(r, v*2+1, tm+1, tr));
}
void solve(){
cin >> n >> m;
set<int>st;
map<int, int>mp;
FOR(i, 1, n, 1){
cin >> a[i];
st.in(a[i]);
}
k=1;
FOR(i, 1, n*6, 1)d[i] = -1;
for(auto i : st)mp[i] = k, k ++;
FOR(i, 1, n, 1)a[i] = mp[a[i]], sp[i][0] = a[i];
FOR(i, 1, 20, 1){
FOR(j, 1, n - (1 << i)+1, 1){
sp[j][i] = min(sp[j][i-1], sp[j+(1<<(i-1))][i-1]);
}
}
m++;
FOR(i, 1, n, 1){
if(i > m)
upd(1, get(i-m+1, i)-1, 0);
x = get1(a[i]-1);
x = max(x+1, get1(a[i]));
upd(a[i], a[i], x);
ans = max(ans, x);
}
cout << ans;
}
signed main(){
nikita
int t=1;
// cin >> t;
while(t--)solve();
}