#include #define ll long long #define endl "\n" #define fi first #define se second #define pb push_back #define ins insert #define dttn ios::sync_with_stdio(false);cin.tie(nullptr); using namespace std; const int mxn = 100005; const int HINF = 1e9; const ll INF = 1e18; const ll MOD = 1e9 + 7; ll bit[mxn]; void update(int id, ll val, int m){ for(; id <= m; id += id & -id){ bit[id] = max(bit[id], val); } } ll query(int id){ ll res = 0; for(; id > 0; id -= id & -id){ res = max(res, bit[id]); } return res; } int main(){ dttn if(fopen("wiseq.inp", "r")){ freopen("wiseq.inp", "r", stdin); freopen("wiseq.out", "w", stdout); } int n, k; cin >> n >> k; vector a(n + 1); ll s = 0; for(int i = 1; i <= n; i++){ cin >> a[i]; s += a[i]; } if(k == s){ vector dp; for(int i = 1; i <= n; i++){ auto it = lower_bound(dp.begin(), dp.end(), a[i]); if(it == dp.end()) dp.pb(a[i]); else *it = a[i]; } cout << dp.size(); } else{ vector v; for(int i = 1; i <= n; i++){ v.pb(a[i]); } sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end()); int m = v.size(); ll ans = 0; int res = 0; vector ta; for(int i = 1; i <= n; i++){ int r = lower_bound(v.begin(), v.end(), a[i]) - v.begin() + 1; ll mx = query(r - 1); if(a[i] + mx <= k){ ll dp = a[i] + mx; ans = max(ans, dp); update(r, dp, m); auto it = lower_bound(ta.begin(), ta.end(), a[i]); if(it == ta.end()){ ta.pb(a[i]); } else *it = a[i]; int m = ta.size(); res = max(res, m); } } cout << res; } return 0; }