# E - Gluttony



import numpy as np



# np.arrayに変換する場合はsortedを使うよりnp.sortを使う方が少し速い

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

A = np.sort(np.array((list(map(int, input().split())))))

F = np.sort(np.array(sorted((list(map(int, input().split()))))))[::-1]



lower = 0

upper = A[-1] * F[0]



# 達成可能な最高成績を二分探索する

while lower <= upper:

    result = (lower + upper) // 2

    # resultを達成可能なAと実際のAの差異の総和が必要な修行コスト

    # np.arrayの和を求める場合、sum(array)よりarray.sum()の方が速い(使わないとTLE)

    if np.clip(A - result//F, 0, None).sum() <= K:

        ans = result

        upper = result - 1

    else:

        lower = result + 1



print(ans)
# E - Gluttony



import numpy as np



# np.arrayに変換する場合はsortedを使うよりnp.sortを使う方が少し速い

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

A = np.sort(np.array((list(map(int, input().split())))))

F = np.sort(np.array(((list(map(int, input().split()))))))[::-1]



lower = 0

upper = A[-1] * F[0]



# 達成可能な最高成績を二分探索する

while lower <= upper:

    result = (lower + upper) // 2

    # resultを達成可能なAと実際のAの差異の総和が必要な修行コスト

    # np.arrayの和を求める場合、sum(array)よりarray.sum()の方が速い(使わないとTLE)

    if np.clip(A - result//F, 0, None).sum() <= K:

        ans = result

        upper = result - 1

    else:

        lower = result + 1



print(ans)
# E - Gluttony
import numpy as np

# np.arrayに変換する場合はsortedを使うよりnp.sortを使う方が少し速い
N, K = list(map(int, input().split()))
A = np.sort(np.array((list(map(int, input().split())))))
F = np.sort(np.array(sorted((list(map(int, input().split()))))))[::-1]
lower = 0
upper = A[-1] * F[0]
# 達成可能な最高成績を二分探索する
while lower <= upper:
    result = (lower + upper) // 2
    # resultを達成可能なAと実際のAの差異の総和が必要な修行コスト
    # np.arrayの和を求める場合、sum(array)よりarray.sum()の方が速い(使わないとTLE)
    if np.clip(A - result // F, 0, None).sum() <= K:
        ans = result
        upper = result - 1
    else:
        lower = result + 1
print(ans)

# E - Gluttony
import numpy as np

# np.arrayに変換する場合はsortedを使うよりnp.sortを使う方が少し速い
N, K = list(map(int, input().split()))
A = np.sort(np.array((list(map(int, input().split())))))
F = np.sort(np.array(((list(map(int, input().split()))))))[::-1]
lower = 0
upper = A[-1] * F[0]
# 達成可能な最高成績を二分探索する
while lower <= upper:
    result = (lower + upper) // 2
    # resultを達成可能なAと実際のAの差異の総和が必要な修行コスト
    # np.arrayの和を求める場合、sum(array)よりarray.sum()の方が速い(使わないとTLE)
    if np.clip(A - result // F, 0, None).sum() <= K:
        ans = result
        upper = result - 1
    else:
        lower = result + 1
print(ans)

-F = np.sort(np.array(sorted((list(map(int, input().split()))))))[::-1] +F = np.sort(np.array(((list(map(int, input().split()))))))[::-1]