#include using namespace std; using ll = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; ll B; cin >> N >> B; vector C(N); vector S(N); for (int i = 0; i < N; i++) { cin >> C[i]; } for (int i = 0; i < N; i++) { cin >> S[i]; } vector> cs; for (int i = 0; i < N; i++) { cs.emplace_back(C[i], S[i]); } sort(cs.begin(), cs.end()); vector prefixSumCost(N + 1, 0LL); vector prefixSumS(N + 1, 0LL); for (int i = 1; i <= N; i++) { prefixSumCost[i] = prefixSumCost[i - 1] + cs[i - 1].first * cs[i - 1].second; prefixSumS[i] = prefixSumS[i - 1] + cs[i - 1].second; } ll ans = 0; for (int k = 0; k < N; k++) { // binary search ll ck = cs[k].first; ll sk = cs[k].second; if (B <= sk) { ans = max(ans, B); continue; } ll rem = B - sk; int left = 0; int right = N; while (right > left) { int mid = left + (right - left + 1) / 2; ll cost = mid > k ? prefixSumCost[mid] - ck * sk : prefixSumCost[mid]; if (cost <= rem) { left = mid; } else { right = mid - 1; } } if (left == N) { ans = max(ans, prefixSumS[N]); continue; } ll count = sk; if (left < k) { count += prefixSumS[left]; count += (rem - prefixSumCost[left]) / cs[left].first; } else { count += prefixSumS[left] - sk; count += (rem - prefixSumCost[left] + ck * sk) / cs[left].first; } ans = max(ans, count); } cout << ans << endl; }