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 C (Clang 3.8.0) (judge verdict: Wrong Answer)

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
#include <string.h>
#include <math.h>

int compare (const void *a, const void *b)
{
    if(*(uintmax_t *)a < *(uintmax_t *)b)
        return 1;
    if(*(uintmax_t *)a > *(uintmax_t *)b)
        return -1;
    return 0;
}

int main (void)
{
    uintmax_t N, M, A[(int)1e5];
    uintmax_t ans = 0, msb = (INTMAX_C(1) << 63);
    size_t i;

    scanf("%ju%ju", &N, &M);
    for (i = 0; i < N; i++) {
        scanf("%ju", &A[i]);
    }

    qsort(A, N, sizeof(uintmax_t), compare);

    while((msb & A[0]) == 0) msb >>= 1;

    i = 0;
    do {
        if (A[i] & msb) {
            A[i] >>= 1;
            i++;
        } else {
            qsort(A, (i + 1), sizeof(uintmax_t), compare);
            msb >>= 1;
            i = 0;
            A[i] >>= 1;
            i++;
        }
        if (i > N) i = 0;
    } while (--M || (msb == 0));

    for (i = 0; i < N; i++) {
        ans += A[i];
    }

    printf("%jd\n", ans);

    return 0;
}