#include using namespace std; using ll = long long; using i128 = __int128; using pll = pair; using vll = vector; template using max_heap = priority_queue; template using min_heap = priority_queue, greater<>>; constexpr ll INF = (1LL << 60); ll ALPHABET_N = 26; #define rep(i, n) for (ll i = (ll)0; i < (ll)n; i++) #define rep_(i, k, n) for (ll i = (ll)k; i < (ll)n; i++) #define rrep(i, n) for (ll i = (ll)(n) - 1; i >= 0; i--) #define all(a) a.begin(), a.end() #define sum_(a) accumulate(a.begin(), a.end(), 0LL) template bool chmax(T &a, const T &b) { if (a < b) { a = b; return true; } return false; } template bool chmin(T &a, const T &b) { if (a > b) { a = b; return true; } return false; } #include using namespace atcoder; using mint = modint998244353; struct S { long long value; int size; }; using F = long long; const F ID = 8e18; S op(S a, S b) { return {a.value + b.value, a.size + b.size}; } S e() { return {0, 0}; } S mapping(F f, S x) { if (f != ID) x.value = f * x.size; return x; } F composition(F f, F g) { return (f == ID ? g : f); } F id() { return ID; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); ll n, b; cin >> n >> b; ll ans = 0; vll C(n), S_(n); rep(i, n) cin >> C[i]; rep(i, n) cin >> S_[i]; vector CS; rep(i, n) CS.emplace_back(C[i], S_[i]); sort(all(CS)); atcoder::lazy_segtree segcs(n), segs(n); ll idx = 0; for (auto [c, s] : CS) { segcs.set(idx, {c * s, 1}); segs.set(idx, {s, 1}); idx++; } rep(i, n) { auto [c, s] = CS[i]; ll cnt = min({b, s}); ll restb = b - cnt; segcs.set(i, {0, 1}); segs.set(i, {0, 1}); ll l = 0, r = n + 1; while ((r - l) > 1) { ll mid = (l + r) / 2; ll ssum = segcs.prod(0, mid).value; if (ssum < restb) { l = mid; } else { r = mid; } } ll ret = cnt + segs.prod(0, l).value; ll restb_ = restb - segcs.prod(0, l).value; if (l < C.size()) ret += restb_ / CS[l].first; chmax(ans, ret); segcs.set(i, {c * s, 1}); segs.set(i, {s, 1}); } cout << ans << endl; return 0; }