#include using namespace std; using ll = long long; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, B; cin >> n >> B; ll ok = 0, ng = 0; vector> a(n); for(int i = 0; i < n; i++) cin >> a[i].first; for(int i = 0; i < n; i++) cin >> a[i].second, ng += a[i].second; sort(a.begin(), a.end()); ng++; while(ok + 1 < ng){ ll mid = (ok + ng) / 2; vector cnt(n); vector> b; ll r = mid, cur = 0; for(int i = 0; i < n && r >= 1; i++){ int d = min((ll)a[i].second, r); r -= d; cur += (ll)(d) * a[i].first; cnt[i] = d; b.emplace_back(a[i].first, d); } reverse(b.begin(), b.end()); int m = b.size(); vector sv(m + 1), sv2(m + 1); for(int i = 0; i < m; i++){ sv[i + 1] = sv[i] + b[i].second; sv2[i + 1] = sv2[i] + b[i].first * (ll)(b[i].second); } ll mn = cur; for(int i = 0; i < n; i++){ if(a[i].second >= mid){ mn = mid; break; } if(cnt[i] == a[i].second){ mn = min(mn, cur - a[i].second * (a[i].first - 1)); }else{ // 大きい方からa[i].second個を1にする // 0 2 5 int p = lower_bound(sv.begin(), sv.end(), a[i].second) - sv.begin(); p--; mn = min(mn, cur - (sv2[p] + (a[i].second - sv[p]) * b[p].first) + a[i].second); } } (B >= mn ? ok : ng) = mid; } cout << ok << '\n'; }