#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
struct st {
vector<ll> t;
st(ll n) {
t.assign(4 * n, -1e18);
}
void upd(ll v, ll l, ll r, ll i, ll x) {
if (l + 1 == r) {
t[v] = x;
return;
}
ll md = (l + r) >> 1;
if (i < md) upd(2 * v + 1, l, md, i, x);
else upd(2 * v + 2, md, r, i, x);
t[v] = max(t[2 * v + 1], t[2 * v + 2]);
}
ll get(ll v, ll l, ll r, ll ql, ll qr) {
if (l >= qr || ql >= r) return -1e18;
if (l >= ql && r <= qr) return t[v];
ll md = (l + r) >> 1;
return max(get(2 * v + 1, l, md, ql, qr), get(2 * v + 2, md, r, ql, qr));
}
};
ll db(ll n, ll d, vector<ll> a) {
ll ans = 0;
vector<ll> st;
for (ll i = n - 1; i > -1; i--) {
while (st.size() && st.back() <= a[i]) st.pop_back();
st.push_back(a[i]);
ans = max(ans, (ll)st.size());
}
return ans;
}
void solve() {
ll n, d;
cin >> n >> d;
vector<ll> a(n);
for (ll& x : a) cin >> x;
vector<ll> b = a;
sort(all(b));
b.resize(unique(all(b)) - b.begin());
for (ll& x : a) x = lower_bound(all(b), x) - b.begin();
vector<vector<ll>> op(n);
for (ll i = 0; i < n; i++) op[a[i]].push_back(i);
vector<ll> dp(n, -1e18);
st dd(n);
set<pair<ll, ll>> otr, bd;
otr.insert({0, n - 1});
if (n + 1 >= d) bd.insert({0, n - 1});
for (ll x = 0; x < n; x++) {
for (ll i : op[x]) {
dp[i] = 1;
ll r = 0;
if (bd.size()) {
auto it = bd.upper_bound({i, (ll)1e18});
if (bd.begin() != it) {
--it;
if ((*it).first == i) {
if (it != bd.begin()) {
--it;
r = (*it).second + 1;
}
} else {
if ((*it).second < i) {
r = (*it).second + 1;
} else {
if (i - (*it).first + 1 > d) r = i;
else {
if (it != bd.begin()) {
--it;
r = (*it).second + 1;
}
}
}
}
}
}
dp[i] = max(dp[i], dd.get(0, 0, n, r, i) + 1);
//cout << r << ' ' << i << ' ' << dp[i] << '\n';
}
for (ll i : op[x]) {
dd.upd(0, 0, n, i, dp[i]);
auto it = otr.upper_bound({i, (ll)1e18});
assert(it != otr.begin());
--it;
if ((*it).first == (*it).second) {
assert((*it).first == i);
otr.erase(it);
bd.erase({i, i});
continue;
}
ll l = (*it).first, r = (*it).second;
if (l == i) {
otr.erase({l, r});
otr.insert({l + 1, r});
bd.erase({l, r});
if (r - l + 1 > d) bd.insert({l + 1, r});
} else if (r == i) {
otr.erase({l, r});
otr.insert({l, r - 1});
bd.erase({l, r});
if (r - l + 1 > d) bd.insert({l, r - 1});
} else {
otr.erase({l, r});
otr.insert({l, i - 1});
otr.insert({i + 1, r});
bd.erase({l, r});
if (r - (i + 1) + 2 > d) bd.insert({i + 1, r});
if (i - 1 - l + 2 > d) bd.insert({l, i - 1});
}
}
// cout << x << '\n';
// cout << "otr" << '\n';
// for (auto [l, r] : otr) cout << l << ' ' << r << '\n';
// cout << "bd" << '\n';
// for (auto [l, r] : bd) cout << l << ' ' << r << '\n';
// cout << '\n';
}
ll mx = 0;
for (ll i = 0; i < n; i++) mx = max(mx, dp[i]);
cout << mx;
}
mt19937 rnd(52);
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
solve();
// for (ll _ = 0; _ < 1e5; _++) {
// ll n = rnd() % 6 + 1;
// vector<ll> a(n);
// for(ll& x : a) x = rnd() % 6 + 1;
// if (solve(n, 1, a) != db(n, 1, a)) {
// cout << n << ' ' << 1 << '\n';
// for (ll x : a) cout << x << ' ';
// cout << '\n';
// cout << "My" << ' ' << solve(n, 1, a) << '\n';
// cout << "Cor" << ' ' << db(n, 1, a);
// return 0;
// }
// }
//cout << solve(4, 1, {3, 5, 4, 6});
}