#include <iostream>
using namespace std;
int n, tx, a[20010];
struct node
{
int k, id;
};
inline node min(node a, node b)
{
return a.k < b.k ? a : b;
}
struct tree
{
node k; int f, l, r;
} t[40010];
inline void build(int tp, int l, int r)
{
t[tp].l = l, t[tp].r = r;
if (l == r) {t[tp].k = {a[l], l}; return;}
int mid = (l + r) >> 1;
build(tp << 1, l, mid);
build(tp << 1 | 1, mid + 1, r);
t[tp].k = min(t[tp << 1].k, t[tp << 1 | 1].k);
}
inline void down(int tp)
{
t[tp << 1].k.k += t[tp].f;
t[tp << 1 | 1].k.k += t[tp].f;
t[tp << 1].f += t[tp].f;
t[tp << 1 | 1].f += t[tp].f;
t[tp].f = 0;
}
inline void change(int tp, int x, int k)
{
if (t[tp].l == t[tp].r)
{
t[tp].k.k = k;
return;
}
down(tp);
int mid = (t[tp].l + t[tp].r) >> 1;
if (x <= mid) change(tp << 1, x, k);
else change(tp << 1 | 1, x, k);
t[tp].k = min(t[tp << 1].k, t[tp << 1 | 1].k);
}
inline bool check(int x)
{
build(1, 1, x);
long long sum = 0;
for (int i = x + 1; i <= n + x + 1; ++i)
{
node p = t[1].k;
if (p.k <= 1e5)
{
sum += p.k;
t[1].k.k -= p.k;
t[1].f -= p.k;
change(1, p.id, a[i]);
}
else return sum <= tx;
}
return sum <= tx;
}
int main()
{
cin >> n >> tx;
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int i = n + 1; i <= n + n; ++i) a[i] = 1e9;
int l = 1, r = n, k;
while (l <= r)
{
int mid = (l + r) >> 1;
if (check(mid)) r = mid - 1, k = mid;
else l = mid + 1;
}
cout << k;
return 0;
}