/*
Cred : SunnyYeahBoi
It's my last chance (⌐■_■)
Problem :
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define double long double
#define endl "\n"
#define NAME "a"
const int inf = 1e18;
const int MOD = 1e9 + 7;
const int N = 5e5 + 5;
void FileInput(){
if(fopen(NAME".inp" , "r") == NULL)
freopen(NAME".inp" , "w" , stdout);
freopen(NAME".inp" , "r" , stdin);
freopen(NAME".out" , "w" , stdout);
}
int n , W;
int a[N];
namespace subtask4{
const int MAXN = 500 + 5;
int dp[MAXN][MAXN]; // trọng số nhỏ nhất của LIS độ dài j xét tới vị trí i
void solve(){
for(int i = 0 ; i <= n ; i++)
for(int j = 0 ; j <= n ; j++)
dp[i][j] = inf;
dp[0][0] = 0;
int res = 0;
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= n ; j++){
for(int k = 0 ; k < i ; k++){
if(a[k] < a[i] || k == 0)
dp[i][j] = min(dp[i][j] , dp[k][j - 1] + a[i]);
}
if(dp[i][j] <= W) res = max(res , j);
}
}
cout << res << endl;
}
}
namespace subtask5{
const int MAXN = 5e5 + 5;
void solve(){
vector<int> st;
for(int i = 1 ; i <= n ; i++){
if(st.empty() || st.back() < a[i]){
st.push_back(a[i]);
continue;
}
int id = lower_bound(st.begin() , st.end() , a[i]) - st.begin();
st[id] = a[i];
}
cout << st.size() << endl;
}
}
void solve(){
cin >> n >> W;
for(int i = 1 ; i <= n ; i++)
cin >> a[i];
if(n <= 500)
subtask4::solve();
else subtask5::solve();
}
int32_t main(){
//FileInput();
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t = 1;
// cin >> t;
while(t--)
solve();
return 0;
}
LyoKICAgIENyZWQgOiBTdW5ueVllYWhCb2kKICAgIEl0J3MgbXkgbGFzdCBjaGFuY2UgKOKMkOKWoF/ilqApCiAgICBQcm9ibGVtIDoKKi8KCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBpbnQgbG9uZyBsb25nCiNkZWZpbmUgZG91YmxlIGxvbmcgZG91YmxlCiNkZWZpbmUgZW5kbCAiXG4iCiNkZWZpbmUgTkFNRSAiYSIKY29uc3QgaW50IGluZiA9IDFlMTg7CmNvbnN0IGludCBNT0QgPSAxZTkgKyA3Owpjb25zdCBpbnQgTiA9IDVlNSArIDU7Cgp2b2lkIEZpbGVJbnB1dCgpewogICAgaWYoZm9wZW4oTkFNRSIuaW5wIiAsICJyIikgPT0gTlVMTCkKICAgICAgICBmcmVvcGVuKE5BTUUiLmlucCIgLCAidyIgLCBzdGRvdXQpOwogICAgZnJlb3BlbihOQU1FIi5pbnAiICwgInIiICwgc3RkaW4pOwogICAgZnJlb3BlbihOQU1FIi5vdXQiICwgInciICwgc3Rkb3V0KTsKfQppbnQgbiAsIFc7CmludCBhW05dOwoKbmFtZXNwYWNlIHN1YnRhc2s0ewogICAgY29uc3QgaW50IE1BWE4gPSA1MDAgKyA1OwoKICAgIGludCBkcFtNQVhOXVtNQVhOXTsgLy8gdHLhu41uZyBz4buRIG5o4buPIG5o4bqldCBj4bunYSBMSVMgxJHhu5kgZMOgaSBqIHjDqXQgdOG7m2kgduG7iyB0csOtIGkKCiAgICB2b2lkIHNvbHZlKCl7CiAgICAgICAgZm9yKGludCBpID0gMCA7IGkgPD0gbiA7IGkrKykKICAgICAgICAgICAgZm9yKGludCBqID0gMCA7IGogPD0gbiA7IGorKykKICAgICAgICAgICAgICAgIGRwW2ldW2pdID0gaW5mOwogICAgICAgIGRwWzBdWzBdID0gMDsKCiAgICAgICAgaW50IHJlcyA9IDA7CiAgICAgICAgZm9yKGludCBpID0gMSA7IGkgPD0gbiA7IGkrKyl7CiAgICAgICAgICAgIGZvcihpbnQgaiA9IDEgOyBqIDw9IG4gOyBqKyspewogICAgICAgICAgICAgICAgZm9yKGludCBrID0gMCA7IGsgPCBpIDsgaysrKXsKICAgICAgICAgICAgICAgICAgICBpZihhW2tdIDwgYVtpXSB8fCBrID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIGRwW2ldW2pdID0gbWluKGRwW2ldW2pdICwgZHBba11baiAtIDFdICsgYVtpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZihkcFtpXVtqXSA8PSBXKSByZXMgPSBtYXgocmVzICwgaik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGNvdXQgPDwgcmVzIDw8IGVuZGw7CiAgICB9Cn0KCm5hbWVzcGFjZSBzdWJ0YXNrNXsKICAgIGNvbnN0IGludCBNQVhOID0gNWU1ICsgNTsKCiAgICB2b2lkIHNvbHZlKCl7CiAgICAgICAgdmVjdG9yPGludD4gc3Q7CiAgICAgICAgZm9yKGludCBpID0gMSA7IGkgPD0gbiA7IGkrKyl7CiAgICAgICAgICAgIGlmKHN0LmVtcHR5KCkgfHwgc3QuYmFjaygpIDwgYVtpXSl7CiAgICAgICAgICAgICAgICBzdC5wdXNoX2JhY2soYVtpXSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaW50IGlkID0gbG93ZXJfYm91bmQoc3QuYmVnaW4oKSAsIHN0LmVuZCgpICwgYVtpXSkgLSBzdC5iZWdpbigpOwogICAgICAgICAgICBzdFtpZF0gPSBhW2ldOwogICAgICAgIH0KICAgICAgICBjb3V0IDw8IHN0LnNpemUoKSA8PCBlbmRsOwogICAgfQp9Cgp2b2lkIHNvbHZlKCl7CiAgICBjaW4gPj4gbiA+PiBXOwogICAgZm9yKGludCBpID0gMSA7IGkgPD0gbiA7IGkrKykKICAgICAgICBjaW4gPj4gYVtpXTsKCiAgICBpZihuIDw9IDUwMCkKICAgICAgICBzdWJ0YXNrNDo6c29sdmUoKTsKICAgIGVsc2Ugc3VidGFzazU6OnNvbHZlKCk7Cn0KCmludDMyX3QgbWFpbigpewogICAgLy9GaWxlSW5wdXQoKTsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7Y2luLnRpZSgwKTtjb3V0LnRpZSgwKTsKICAgIGludCB0ID0gMTsKICAgIC8vIGNpbiA+PiB0OwogICAgd2hpbGUodC0tKQogICAgICAgIHNvbHZlKCk7CiAgICByZXR1cm4gMDsKfQo=