import math



#成績xを取れるか？xに関して二分探索



N,K = list(map(int,input().split()))

A = list(map(int,input().split()))

F = list(map(int,input().split()))



#Aを小さい順，Fを大きい順に並べれば対応する．

A.sort()

F.sort(reverse =True)

AF=[0]*N



for i in range(N):

    AF[i]=A[i]*F[i]

    

ng=-1

ok=10**12+1



#二分探索，成績xをとるのにi番目の人が何回修行すべきか，これがK以下なら良い

while ok-ng!=1:

    x = (ok+ng)//2

    num_tra =0

    for i in range(N):

        af_i = int(math.ceil((AF[i]-x)/F[i]))

        if af_i>0:

            num_tra+=af_i

    if num_tra<=K:

        ok=x

    else:

        ng=x

        

print(ok)
import sys

input = sys.stdin.readline



def I(): return int(eval(input()))

def MI(): return list(map(int, input().split()))

def LI(): return list(map(int, input().split()))





"""

コストが低い人が食べにくいものを食べる．

コストが低い人を追い抜かすことはない，（追い抜かすなら入れ替えて良いから）





"""

def main():

    mod=10**9+7

    N,K=MI()

    A=LI()

    F=LI()

    F.sort()

    A.sort(reverse=True)

    

    if K>=sum(A):

        print((0))

        exit()

        

    def ch(x):

        # x秒でクリアできるか

        temp=0#　必要修行回数

        for i in range(N):

            af=A[i]*F[i]

            if af>x:

                add=(af-x+F[i]-1)//F[i]

                temp+=(add)

                

        return temp <= K

        

    ok=10**12

    ng=0

    

    while ok-ng>1:

        med=(ok+ng)//2

        if ch(med):

            ok=med

        else:

            ng=med 

            

    print(ok)

    

main()

import math

# 成績xを取れるか？xに関して二分探索
N, K = list(map(int, input().split()))
A = list(map(int, input().split()))
F = list(map(int, input().split()))
# Aを小さい順，Fを大きい順に並べれば対応する．
A.sort()
F.sort(reverse=True)
AF = [0] * N
for i in range(N):
    AF[i] = A[i] * F[i]
ng = -1
ok = 10**12 + 1
# 二分探索，成績xをとるのにi番目の人が何回修行すべきか，これがK以下なら良い
while ok - ng != 1:
    x = (ok + ng) // 2
    num_tra = 0
    for i in range(N):
        af_i = int(math.ceil((AF[i] - x) / F[i]))
        if af_i > 0:
            num_tra += af_i
    if num_tra <= K:
        ok = x
    else:
        ng = x
print(ok)

import sys

input = sys.stdin.readline


def I():
    return int(eval(input()))


def MI():
    return list(map(int, input().split()))


def LI():
    return list(map(int, input().split()))


"""
コストが低い人が食べにくいものを食べる．
コストが低い人を追い抜かすことはない，（追い抜かすなら入れ替えて良いから）
"""


def main():
    mod = 10**9 + 7
    N, K = MI()
    A = LI()
    F = LI()
    F.sort()
    A.sort(reverse=True)
    if K >= sum(A):
        print((0))
        exit()

    def ch(x):
        # x秒でクリアできるか
        temp = 0  # 　必要修行回数
        for i in range(N):
            af = A[i] * F[i]
            if af > x:
                add = (af - x + F[i] - 1) // F[i]
                temp += add
        return temp <= K

    ok = 10**12
    ng = 0
    while ok - ng > 1:
        med = (ok + ng) // 2
        if ch(med):
            ok = med
        else:
            ng = med
    print(ok)


main()

-import math +import sys -# 成績xを取れるか？xに関して二分探索 -N, K = list(map(int, input().split())) -A = list(map(int, input().split())) -F = list(map(int, input().split())) -# Aを小さい順，Fを大きい順に並べれば対応する． -A.sort() -F.sort(reverse=True) -AF = [0] * N -for i in range(N): -    AF[i] = A[i] * F[i] -ng = -1 -ok = 10**12 + 1 -# 二分探索，成績xをとるのにi番目の人が何回修行すべきか，これがK以下なら良い -while ok - ng != 1: -    x = (ok + ng) // 2 -    num_tra = 0 -    for i in range(N): -        af_i = int(math.ceil((AF[i] - x) / F[i])) -        if af_i > 0: -            num_tra += af_i -    if num_tra <= K: -        ok = x -    else: -        ng = x -print(ok) +input = sys.stdin.readline + + +def I(): +    return int(eval(input())) + + +def MI(): +    return list(map(int, input().split())) + + +def LI(): +    return list(map(int, input().split())) + + +""" +コストが低い人が食べにくいものを食べる． +コストが低い人を追い抜かすことはない，（追い抜かすなら入れ替えて良いから） +""" + + +def main(): +    mod = 10**9 + 7 +    N, K = MI() +    A = LI() +    F = LI() +    F.sort() +    A.sort(reverse=True) +    if K >= sum(A): +        print((0)) +        exit() + +    def ch(x): +        # x秒でクリアできるか +        temp = 0  # 　必要修行回数 +        for i in range(N): +            af = A[i] * F[i] +            if af > x: +                add = (af - x + F[i] - 1) // F[i] +                temp += add +        return temp <= K + +    ok = 10**12 +    ng = 0 +    while ok - ng > 1: +        med = (ok + ng) // 2 +        if ch(med): +            ok = med +        else: +            ng = med +    print(ok) + + +main()