// #pragma GCC optimize("Ofast") // #pragma GCC optimize("O3") #include using namespace std; #define int long long // #define ll long long #define vec vector #define PB push_back #define all(x) x.begin(), x.end() #define F first #define S second // #define ull unsigned long long #define pii pair #define rz resize #define ld long double // #define yes cout << "Yes\n" // #define no cout << "No\n" // #define matrix vec> #define MP make_pair #define i128 __int128 const int N = 50002; const int mod = 1e9+7; const int inf = 1e17; const int B = 300; // mt19937_64 rng(time(0)); // int random(int a, int b) { return uniform_int_distribution(a, b)(rng); } // int add(int a, int b){ ll c=a+b; if(c >= mod) c -= mod; return (int)c; } // int sub(int a, int b){ a -= b; if(a < 0) a += mod; return a; } // int lcm(int a, int b){ return a*b/__gcd(a,b); } int n,w; int a[N]; struct Fenw { vecf; int n; Fenw(int _n):n(_n){ f.rz(n+1,inf); } void upd(int x,int v){ for(;x<=n;x+=x&-x)f[x]=min(f[x],v); } int quer(int x){ int r=inf;for(;x>0;x-=x&-x)r=min(r,f[x]);return r; } }; namespace sub4{ bool chk(){ return (n <= 500); } void solve(){ vec>dp(n+1,vec(n+1)); for(int i=1;i<=n;++i)dp[i][1]=a[i]; for(int j=2;j<=n;++j){ Fenw f(n); for(int i=1;i<=n;++i){ dp[i][j]=f.quer(a[i]-1)+a[i]; if(dp[i][j-1]!=inf)f.upd(a[i],dp[i][j-1]); } } int an=0; for(int i=1;i<=n;++i){ for(int j=1;j<=i;++j)if(dp[i][j] <= w)an=max(an,j); } cout<0;x-=x&-x)r=max(r,f[x]);return r; } namespace sub5{ void solve(){ int an=0; for(int i=1;i<=n;++i){ int q=quer(a[i]-1)+1; an=max(an,q); upd(a[i],q); } cout<>n>>w; for(int i=1;i<=n;++i)cin>>a[i]; if(sub4::chk()){ sub4::solve(); } else { sub5::solve(); } return 0; }