#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
struct Node {
  int val, id;
  bool operator<(const Node& rhs) const { return val > rhs.val; }
};
priority_queue<Node> que;
int n, T;
int sum[maxn << 2];
void PushUp(int v) { sum[v] = sum[v << 1] + sum[v << 1 | 1]; }
void update(int p, int val, int l, int r, int v) {
  if (l == r)
    sum[v] = val;
  else {
    int m = (l + r) >> 1;
    if (p <= m)
      update(p, val, l, m, v << 1);
    else
      update(p, val, m + 1, r, v << 1 | 1);
    PushUp(v);
  }
}
int query(int L, int R, int l, int r, int v) {
  if (L > R) return 0;
  if (L <= l && r <= R) return sum[v];
  int ans = 0;
  int m = (l + r) >> 1;
  if (L <= m) ans += query(L, R, l, m, v << 1);
  if (R > m) ans += query(L, R, m + 1, r, v << 1 | 1);
  return ans;
}
int main(int argc, char const* argv[]) {
  cin >> n >> T;
  T--;
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    if (x <= i)
      update(i, 1, 1, n, 1);
    else
      que.push((Node){x - i, i});
  }
  int ans = query(1, min(n, T), 1, n, 1);
  while (!que.empty()) {
    int p = que.top().val;
    while (!que.empty() && que.top().val <= p) {
      auto x = que.top();
      que.pop();
      update(x.id, 1, 1, n, 1);
    }
    int l = 1, r = max(0, min(T - p, n));
    ans = max(ans, query(l, r, 1, n, 1));
  }
  cout << ans << endl;
  return 0;
}
