program sample
    implicit none
    
    integer(8) :: i,j,m,n,a,b,c,d,dis,p,q,ma
    integer(8),allocatable :: x(:),y(:),indy(:),ans(:)
  
    read(*,*) n,m
    a=m/2
    allocate(x(n),y(0:a),indy(0:a),ans(n))
    read(*,*)x
    call msort(x)
    ans(:)=x(:)
    y(:)=0
    q=0  !キューの要素数-1

    y(0)=x(n)
    indy(0)=n
    do i=1,m
        ma=0
        do j=0,q !キューでの最大値とその場所
            if(y(j)>ma)then
                ma=y(j)
                b=j
            end if
        end do
        a=indy(b)
        ans(a)=x(a)/2**(b+1)
        if(y(b+1)==0)then
            y(b+1)=ans(a)
        end if
        indy(b)=a-1
        y(b)=x(a-1)/2**b
        if(indy(b)==indy(b-1))then
            y(b)=0
        end if
        if(b==q)then
            q=q+1
            y(q)=x(n)/2**q
            indy(q)=n
        end if
    end do
    write(*,*)sum(ans)
   


    
    stop
    contains
    recursive subroutine msort(x)
    implicit none
    integer(8), intent(inout) :: x(:)
 
    integer(8) :: n, mid, i, j, k
    integer(8), allocatable :: tmp(:)
    
    n = size(x)
    
    if(n == 1) then
      return
    end if
 
    !
    ! 前半と後半に分けてソート
    ! 1~midとmid+1~nをそれぞれソート済みにする
    !
    mid = n / 2
    call msort(x(:mid))
    call msort(x(mid+1:))
 
    !
    ! tmpという配列にxを一時的に保管
    ! マージソートは外部ソート
    !
    allocate(tmp(n))
    tmp = x
 
    ! tmpの後半部分を左右反転
    do k = n, mid+1, -1
      tmp(k) = x(mid + n - k + 1)
    end do
 
    ! iは前半のリストのうちまだ見ていないものの最小値
    ! jは後半のリストのうちまだ見ていないものの最小値
    ! kは見た回数の合計
    i = 1
    j = n
 
    do k = 1, n
      !
      ! 一番左と一番右のうち小さい方をxに入れていく
      ! ここが等号つき不等号なので、安定ソートとなる
      !
      if(tmp(i) <= tmp(j)) then
        x(k) = tmp(i)
        i = i + 1
      else
        x(k) = tmp(j)
        j = j - 1
      end if
    end do
    
    deallocate(tmp)
    return
  end subroutine msort
end program sample
  

