Problem:
Score : 400 points

Problem Statement

Takahashi is going to buy N items one by one.

The price of the i-th item he buys is A_i yen (the currency of Japan).

He has M discount tickets, and he can use any number of them when buying an item.

If Y tickets are used when buying an item priced X yen, he can get the item for \frac{X}{2^Y} (rounded down to the nearest integer) yen.

What is the minimum amount of money required to buy all the items?

Constraints

All values in input are integers.

1 \leq N, M \leq 10^5

1 \leq A_i \leq 10^9

Input

Input is given from Standard Input in the following format:

N M
A_1 A_2 ... A_N

Output

Print the minimum amount of money required to buy all the items.

Sample Input 1

3 3
2 13 8

Sample Output 1

9

We can buy all the items for 9 yen, as follows:

Buy the 1-st item for 2 yen without tickets.

Buy the 2-nd item for 3 yen with 2 tickets.

Buy the 3-rd item for 4 yen with 1 ticket.

Sample Input 2

4 4
1 9 3 5

Sample Output 2

6

Sample Input 3

1 100000
1000000000

Sample Output 3

0

We can buy the item priced 1000000000 yen for 0 yen with 100000 tickets.

Sample Input 4

10 1
1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000

Sample Output 4

9500000000

Solution in OCaml (4.02.3) (judge verdict: Accepted)

module M = Map.Make (
    struct
       type t = int * int
       let compare (a1, a2) (b1, b2) = compare (a1 lsr a2) (b1 lsr b2)
    end)
let () =
    let split s =
        let rec loop i cur flag acc =
            if i = String.length s then ( if flag then cur :: acc else acc) else (
                match flag, s.[i] with
                | true,  ' ' -> loop (i + 1) "" false (cur :: acc)
                | false, ' ' -> loop (i + 1) "" false acc
                | true,  v   -> loop (i + 1) (Printf.sprintf "%s%c" cur v) true acc
                | false, v   -> loop (i + 1) (Printf.sprintf "%s%c" cur v) true acc
            )
        in
        List.map int_of_string (List.rev (loop 0 "" false []))
    in
    let add key v map = M.add key (v + try M.find key map with _ -> 0) map in
    let main () =
        let n, m = Scanf.sscanf (read_line ()) "%d %d" (fun n m -> n, m) in
        let list = split (read_line ()) in
        let map = List.fold_left (fun map a -> add (a, 0) 1 map) M.empty list in
        let rec loop rest map =
            if rest = 0 then map else
                let ((a1, a2) as mk, mv) = M.max_binding map in
                if rest < mv then (
                    let map = M.remove mk map in
                    let map = add mk (mv - rest) map in
                    let map = add (a1, a2 + 1) rest map in
                    map
                ) else (
                    let map = M.remove mk map in
                    let map = add (a1, a2 + 1) mv map in
                    loop (rest - mv) map
                )
        in
        let map = loop m map in
        let r = M.fold (fun (a1, a2) v acc -> acc + v * (a1 lsr a2)) map 0 in
        Printf.printf "%d\n" r
    in
    main ()