#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define INF 0x3f3f3f3f
#define eps 1e-8
#define ll long long
#define ull unsigned long long
#define bug(x) cerr<<"[Debug] "<<#x<<"="<<(x)<<endl
#define el putchar('\n')
#define sp putchar(' ')
using namespace std;
int read() {
int s=0,w=1;
char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0' && ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void write(int x) {
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
const int N = 1e4 + 10;
int MAXN = 1e6;
int n, t, a[N];
bool check(int k) {
priority_queue<int, vector<int>, greater<int> > q;
int cnt = 1;
for (int time = 0; time <= t; time++) {
if (q.empty() && cnt == n) return 1;
while (q.size() < k) {
if (cnt < n) q.push(a[cnt++] + time);
else break;
}
while (!q.empty() && q.top() <= time) {
q.pop();
}
}
if (cnt == n && q.empty()) return 1;
return 0;
}
int main() {
n = read(); t = read();
for (int i = 1; i <= n; i++) {
a[i] = read();
}
int l = 0, r = MAXN, mid;
while (l < r) {
mid = (l + r) >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
cout << l << endl;
return 0;
}