#include<bits/stdc++.h>
using namespace std;
#define ll long long                                    // long long省略
#define pb push_back                                    // push_back省略
#define mp make_pair                                    // make_pair省略
#define fi first                                        // first省略
#define se second                                       // second省略
#define itn int                                         // int誤字保険
#define count cout                                      // cout誤字保険
#define vecotr vector                                   // vector誤字保険
#define opt() cin.tie(0); ios::sync_with_stdio(false)   // 入出力速度改善

#define rep(i,l,r)for(ll i=(l);i<(r);i++)               // 範囲[l, r)で刻み1のfor文(順方向)
#define repp(i,l,r,k)for(ll i=(l);i<(r);i+=(k))         // 範囲[l, r)で刻みkのfor文(順方向)
#define rrep(i,l,r)for(ll i=(r-1);i>=(l);i--)           // 範囲[l, r)で刻み1のfor文(逆方向)
#define rrepp(i,l,r,k)for(ll i=(r-1);i>=(l);i-=(k))     // 範囲[l, r)で刻みkのfor文(逆方向)
#define all(x) (x).begin(), (x).end()                   // vectorのポインタ位置指定用
#define max(p,q)((p)>(q)?(p):(q))                       // max拡張
#define min(p,q)((p)<(q)?(p):(q))                       // min拡張
#define bit(n,m)(((n)>>(m))&1)                          // 変数nのm番目のbitを取り出す

template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }

int dy[]={0, 0, 1, -1};                                 // 4方向近傍
int dx[]={1, -1, 0, 0};                                 // 4方向近傍


/*
   upll : (a<b)なら-1, (a=b)なら0, (a>b)なら1
 downll : (a<b)なら1, (a=b)なら0, (a>b)なら-1

 const void* a : 型を縛らずにconstをつける(=変数aが読み込み専用の変数であることを明示する)
        (ll*)a : 変数aがconst long long *型であると明示する
*/
// int upll(const void*a, const void*b){return*(ll*)a<*(ll*)b?-1:*(ll*)a>*(ll*)b?1:0;}
// int downll(const void*a, const void*b){return*(ll*)a<*(ll*)b?1:*(ll*)a>*(ll*)b?-1:0;}
// void sortup(ll*a,int n){qsort(a,n,sizeof(ll),upll);}
// void sortdown(ll*a,int n){qsort(a,n,sizeof(ll),downll);}
ll pom(ll a,ll n,int m){ll x=1;for(a%=m;n;n/=2)n&1?x=x*a%m:0,a=a*a%m;return x;}

#define INF ((1LL<<62)-(1LL<<31))
//#define MOD 998244353
#define MOD 1000000007
#define invp(a,p) pom(a,p-2,p)

const ll N_MAX = 1000001;
ll n, k;
ll a[N_MAX];
ll f[N_MAX]; 
vector<pair<ll,ll>> p;
// priority_queue<pair<ll,ll>, vector<pair<ll,ll>>, function<bool(pair<ll,ll>,pair<ll,ll>)>> p(
//         [](pair<ll,ll> a, pair<ll,ll> b){
//             if(a.fi != b.fi) return a.fi<b.fi;
//             else             return a.se<b.se;
//         });

bool C(ll mid){
    ll cnt = 0;
    rep(i,0,n){
        pair<ll,ll> tmp = p[i];
        if( tmp.fi > mid ){
            //p.pop();
            ll kk = min(k-cnt, (tmp.fi - mid + tmp.se - 1) / tmp.se);
            cnt += kk;
            //cout << mid << " " << tmp.fi << " " << tmp.se << " " << cnt << " " << tmp.fi - kk*tmp.se << endl;
            if (kk == 0 || tmp.fi - kk*tmp.se > mid){
                //out << "a" << endl;
                return false;
            }
            
            
            //p.push(mp(tmp.fi - kk*tmp.se, tmp.se));
        }
        //if(cnt > k) return false; 
    }
    return true;
}
bool compare(pair<ll,ll> p1, pair<ll,ll> p2){
    return p1.fi > p2.fi;
}

int main(){
    cin >> n >> k;
    rep(i,0,n) cin >> a[i];
    rep(i,0,n) cin >> f[i];

    sort(a,a+n, greater<ll>());
    sort(f,f+n);
    rep(i,0,n) p.pb(mp(a[i]*f[i],f[i]));
    sort(all(p),compare);
    //cout << p.top().fi << endl;
    ll lb = -1, ub = p[0].fi+1, mid;
    while(ub - lb > 1){ 
        mid = (ub + lb) / 2;
        if(C(mid)){
            ub = mid;
        }else{
            lb = mid;
        }
    }
    cout << ub << endl;
}

Measured memory_bytes: 12144