#include #define rep(i, n) for (int i = 0; i < (n); ++i) using namespace std; using ll = long long; using P = pair; int main() { cin.tie(nullptr) -> sync_with_stdio(false); int n, b; cin >> n >> b; vector

ps(n); rep(i, n) cin >> ps[i].first; rep(i, n) cin >> ps[i].second; sort(ps.begin(), ps.end()); vector cost(n+1); vector cnt(n+1); rep(i, n) { cost[i+1] = cost[i] + (ll)ps[i].first*ps[i].second; cnt[i+1] = cnt[i] + ps[i].second; } ll ans = 0; rep(i, n) { ll now = 0; if (ps[i].second >= b) now = b; else { ll r = b-ps[i].second; int ac = 0, wa = n+1; while (abs(ac-wa) > 1) { int wj = (ac+wa)/2; auto ok = [&]{ ll w = cost[wj]; if (wj > i) w -= (ll)ps[i].first*ps[i].second; return w <= r; }(); (ok ? ac : wa) = wj; } ll co = cost[ac]; if (ac > i) co -= (ll)ps[i].first*ps[i].second; ll num = cnt[ac]; if (ac > i) num -= ps[i].second; now = ps[i].second + num; int ni = ac; if (ni == i) ++ni; if (ni < n) { ll cand = (r-co)/ps[ni].first; now += min(ps[ni].second, cand); } } ans = max(ans, now); } cout << ans << '\n'; return 0; }