#include <stdio.h>
#include <stdlib.h>
 
#define height 4
#define MAX (1<<height)  //ビットシフト演算 2^height と同じ
 
int t[MAX+1]; //配列外アクセス防止のためのダミーで＋１
int sz = 0;
 
void swap(int *x, int *y){
    int tmp = *x;
    *x = *y;
    *y = tmp;
}
 
void initTree(int n){
    int i;
    for(i=0;i<MAX;i++){
        t[i] = -1;
    }
}
 
void printA(){
    int i;
    for(i=1;i<=sz;i++) printf("%d ",t[i]);
    printf("\n");
}
 
void printT(int i){
    int x = i;
    while(x/2!=0){
        printf("  ");
        x/=2;
    }
    printf("%d\n",t[i]);
}
 
int goP(int i){
    if(i/2 == 0) return 0;
    else return i/2;
}
 
int goL(int i){
    if(2*i >= MAX) return 0;
    else return 2*i;
}
 
int goR(int i){
    if(2*i+1 >= MAX) return 0;
    else return 2*i+1;
}
 
void preOrder(int i){
    if(t[i] == -1) return;
    printT(i);
    preOrder(goL(i));
    preOrder(goR(i));
}
 
void inOrder(int i){
    if(t[i] == -1) return;
    inOrder(goL(i));
    printT(i);
    inOrder(goR(i));
}
 
void postOrder(int i){
    if(t[i] == -1) return;
    postOrder(goL(i));
    postOrder(goR(i));
    printT(i);
}
 
void insBT(int x){
    int k,i = 1;
    for(k=0;k<height;k++){
        if(t[i]==-1){
            t[i] = x;
            sz++;
            return;
        }
        if(x < t[i]) i = goL(i);
        else i = goR(i);
    }
    printf("Error : too high -> %d\n",x);
}
 
//先頭の要素を取り出す
//ダウンヒープ
int popHeap(){
    int i = 1;
    int l,r,ma;
    int ret = t[i];
    t[i] = t[sz]; //t[1] = t[sz]
    t[sz--] = -1; //t[sz]=-1 をしてから sz=sz-1 の意味
    while(i*2 <= sz){
        l = goL(i);
        r = goR(i);
        //子のうち大きい方と比較する
        if(t[l]<t[r]) ma = r;
        else ma = l;
        //子の大きい方と比較して子が大きければ交換する
        //そうでなければヒープ完了．retを返す
        if(t[i] > t[ma]) break;
        swap(&t[i],&t[ma]);
        i = ma;
    }
    return ret;
}
 
//末尾に要素を追加する
//アップヒープ
void pushHeap(int x){
    int i = ++sz;
    int p;
    t[sz] = x;  //余分なダミー要素を作ってあるので配列外アクセスは無い
    while(1<i){
        p = goP(i);
        if(i>=MAX-1) {
            printf("Error : out size < %d -> %d\n",MAX-1,i);
            t[sz] = -1;
            sz--; //要素数が最大を超えていたら追加をしない
            return;
        }
        //親と比較して，今見ている要素（子）の方が小さければ
        //終了する．そうでなければ入れ替えて，続ける
        if(t[i] <= t[p]) return;
        else swap(&t[i],&t[p]);
        i = p;
    }
}
void sort(int a[], int n){
	int i,j,min;
	for(i=0;i<n;i++){
		min=i;
		for(j=0;j<n;j++){
			if(a[j]<a[min]){
				min=j;
			}
		}
		swap(&a[i],&a[min]);
	}
}
 //必要があれば，関数をいくつでも追加して良い
 
int solve(){
    int ret=0,i,n,q,x;
    int a[50];
    //ここにプログラムを書く
    scanf("%d %d",&n,&q);
    initTree(n);
    for(i=0;i<n;i++){
    	scanf("%d",&a[i]);
    }
    sort(a,n);
    for(i=0;i<n;i++){
    	pushHeap(a[i]);
    }
    for(i=0;i<q;i++){
    	pushHeap(popHeap()/2);
    }
    for(i=1;i<=sz;i++){
    	ret+=t[i];
    }
    return ret;
}
 
//メイン関数はいじらなくて良い
int main(void){
    printf("%d\n",solve());
    return 0;
}