      program q_e
        implicit none

        INTEGER(8) :: N, K
        INTEGER(8) :: Asum
        INTEGER(8) :: i, j
        INTEGER(8) :: x, mid
        INTEGER(8) :: left = -1_8, right = 10_8**13
        INTEGER(8), ALLOCATABLE, DIMENSION(:) :: A, F, FR, C

        READ(*,*) N, K
        
        ALLOCATE(A(N))
        ALLOCATE(F(N))
        ALLOCATE(FR(N))
        ALLOCATE(C(N))
        READ(*,*) A(1:N)
        READ(*,*) F(1:N)

        call heapsort(N, A)
        call heapsort(N, F)
        do i = 1, N
          FR(i) = F(N-i+1)
        end do
        
        Asum = SUM(A)

        do while (left+1 < right)
          mid = (left+right)/int(2, kind=8)
          do j = 1, N
            C(j) = MIN(A(j), mid/FR(j))
            ! C(j) = MIN(A(j)*FR(j), mid)
          end do
          if (Asum - SUM(C).le.K) then
            right = mid
          else
            left = mid
          end if
        end do
        
        write(*,*) right

      contains
            
      ! http://slpr.sakura.ne.jp/qp/sortf90/
        subroutine heapsort(n, array)
          implicit none
          integer(8), intent(in) :: n
          ! double precision, intent(inout) :: array(1:n)
          integer(8), intent(inout) :: array(1:n)

          integer(8) :: i, j, k, l
          double precision :: t

          if (n.le.0) then
            stop
          end if
          if (n.eq.1) return

          l = n/2 + 1
          k = n
          do while (k.ne.1)
            if (l.gt.1) then
              l = l - 1
              t = array(L)
            else
              t = array(k)
              array(k) = array(1)
              k = k - 1
              if (k.eq.1) then
                array(1) = t
                exit
              end if
            end if
            i = l
            j = l + l
            do while(j.le.k)
              if (j.lt.k) then
                if ( array(j).lt.array(j+1)) j = j + 1
              end if
              if (t.le.array(j)) then
                array(i) = array(j)
                i = j
                j = j + j
              else
                j = k + 1
              end if
            end do
            array(i) = t
          end do

          return
        end subroutine
      end program 
