D2. Magic Powder - 2
#include <string>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
long long a[100005],b[100005];
long long n,k;
long long cot,ct;
bool slove(long long mid){
long long sum = k;
if(cot > (ct+sum)/mid) return false;
for(long long i = 1; i <= n; i++){
if(a[i] > b[i]/mid){
sum -= ((long long)a[i]*mid-b[i]);
if(sum < 0) return false;
}
}
if(sum >= 0) return true;
return false;
}
int main()
{
while(~scanf("%I64d%I64d",&n,&k)){
cot = 0,ct = 0;
for(long long i = 1; i <= n; i++){
scanf("%I64d",&a[i]);
cot+=a[i];
}
for(long long i = 1; i <= n; i++){
scanf("%I64d",&b[i]);
ct+=b[i];
}
long long l = 0,r = 2000000005,mid;
while(l+1<r){
mid = (l+r)>>1;
if(slove(mid)){
l = mid;
}else{
r = mid;
}
}
printf("%I64d\n",l);
}
return 0;
}