#include <bits/stdc++.h>
using namespace std;
struct FenwickMax {
int n;
vector<int> bit;
FenwickMax(int n = 0) { init(n); }
void init(int n_) { n = n_; bit.assign(n + 1, 0); }
void update(int idx, int val) {
for (; idx <= n; idx += idx & -idx) bit[idx] = max(bit[idx], val);
}
int query(int idx) const { // max on [1..idx]
int res = 0;
for (; idx > 0; idx -= idx & -idx) res = max(res, bit[idx]);
return res;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
long long M;
cin >> N >> M;
vector<long long> a(N + 1), t(N + 1), vals;
vals.reserve(N);
for (int i = 1; i <= N; i++) {
cin >> a[i];
t[i] = a[i] - 1LL * i * M;
vals.push_back(t[i]);
}
sort(vals.begin(), vals.end());
vals.erase(unique(vals.begin(), vals.end()), vals.end());
int K = (int)vals.size();
FenwickMax fw(K);
int bestKeep = 0;
for (int i = 1; i <= N; i++) {
int rank = int(lower_bound(vals.begin(), vals.end(), t[i]) - vals.begin()) + 1;
int revRank = K - rank + 1; // larger t => smaller revRank
int bestPrev = fw.query(revRank); // previous j with t[j] >= t[i]
int dp = 0;
if (t[i] <= 0) dp = 1; // start from left side directly
if (bestPrev > 0) dp = max(dp, bestPrev + 1);
if (dp > 0) {
fw.update(revRank, dp);
bestKeep = max(bestKeep, dp);
}
}
cout << (N - bestKeep) << '\n';
return 0;
}