#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <unordered_map>
#include <stack>
#include <math.h>
#include <queue>
#include <string>
#define x first
#define y second
//#define endl '\n'
#define rep(a, b, i) for (int i = a; i < b; i++)
#define rev(a, b, i) for (int i = a; i > b; i--)
#define bug(a) cout << a << endl
#define bug2(a, b) cout << a << " " << b << endl
#define bug3(a, b, c) cout << a << " " << b << " " << c << endl
#define read(a) cin>>a
#define read2(a,b) cin>>a>>b
#define read3(a,b,c) cin>>a>>b>>c
#define int long long
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
const int N = 2e5+10, mod = 1e9+7, M = 5e5+10;
int n,m,k,idx=1;
int flag=0;
struct c{
int a,b;
}a[N];
bool cmp(c x,c y){
return x.a<y.a;
}
void solve(){
cin>>n>>m;
rep(1,n+1,i)cin>>a[i].a;
rep(1,n+1,i)cin>>a[i].b;
int mint=0x3f3f3f3f3f3f3f3f,ans=0,cst=0;
sort(a+1,a+1+n,cmp);
rep(1,n+1,i){
mint=min(mint,a[i].a+a[i].b);
ans=max(ans,a[i].a);
cst+=((i-1)*(a[i].a-a[i-1].a));
if((cst+(i*(a[i+1].a-a[i].a)))>=m){
ans+=((m-cst)/(i));
break;
}
if(ans>=mint){
ans=mint;
break;
}
}
cout<<ans;
return;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
// cin>>T;
// while(T--)
solve();
return 0;
}