#pragma once
#include <iostream>
#include <string>
#include <vector>
#include<limits>
#include<stack>
#include<queue>
#include<math.h>
#include <iomanip>

#define rep(i,n) for(auto i=0;i<(n);i++)
#define all(vs) (vs).begin(),(vs).end()
#define roundup(A,B) (A)/(B)+(A%B==0?0:1)
#define maximize(A,B) A=max((A),(B))
#define read(type,name) type name;cin>>name
#define ll long long

using namespace std;
template<typename T>
T MAX() { return numeric_limits<T>::max(); }

//二次元テーブル
template<typename T>
class Table {
public:
	Table(int height, int width, T value) {
		if (width < 0)throw out_of_range("Width should be >=0");
		if (height < 0)throw out_of_range("Height should be >=0");
		this->wid = width;
		this->hgt = height;
		vs = new T[width * height];
		for (auto i = 0; i < width * height; i++)vs[i] = value;
	}
	Table(const Table& table) {
		hgt = table.hgt;
		wid = table.wid;
		vs = new T[hgt * wid];
		for (size_t i = 0; i < table.size(); i++) {
			vs[i] = table.vs[i];
		}
	}
	Table(Table&& table) {
		hgt = table.hgt;
		wid = table.wid;
		swap(vs, table.vs);
	}
	~Table() {
		if (vs)delete[] vs;
	}
	Table& operator=(const Table& table) {
		if (table == *this)return *this;
		this->wid = table.wid;
		this->hgt = table.hgt;
		if (vs)delete[] vs;
		vs = new T[wid * hgt];
		for (auto i = 0; i < wid * hgt; i++)vs[i] = table.vs[i];
	}
	Table& operator=(Table&& table) {
		wid = table.wid;
		hgt = table.hgt;
		swap(vs, table.vs);
	}
	inline T& at(int y, int x) {
		if (wid > x)throw out_of_range("x>width.");
		if (hgt > y)throw out_of_range("y>height.");
		return vs[x + y * wid];
	}
	int size()const { return wid * hgt; }
	int width()const { return wid; };
	int height()const { return hgt; };
	T* begin() { return vs; }
	T* end() { return vs + wid * hgt; }
	T& operator()(int y, int x) { return vs[x + y * wid]; }
	const T& operator()(int y, int x)const { return vs[x + y * wid]; }
private:
	int wid, hgt;
	T* vs;
};//周期的に変化する。ループは剰余の環でうまく表せる。
void A() {
	string weather[]{ "Sunny","Cloudy","Rainy" };
	read(string, s);
	for (auto i = 0; i < 3; i++) {
		if (weather[i] == s) {
			cout << weather[(i + 1) % 3] << endl;
			return;
		}
	}
}
//全てが満たさねばならない条件の検査は、
//間違いを探す方が簡潔になる。
void B() {
	read(string, s);
	for (auto i = 0; i < s.length(); i++) {
		if (i % 2 == 0 && s[i] == 'L') {
			cout << "No" << endl;
			return;
		}
		if (i % 2 != 0 && s[i] == 'R') {
			cout << "No" << endl;
			return;
		}
	}
	cout << "Yes" << endl;
}
// 正解数だけペナルティを免れることができる。
// 問題数-正解数の減点がKを超えるかどうかで判定する。
void C() {
	read(int, N);
	read(int, K);
	read(int, Q);
	auto score = vector<int>(N, -Q + K);
	int win;
	for (auto i = 0; i < Q; i++) {
		cin >> win;
		score[win - 1]++;
	}
	for (auto s : score) cout << (s > 0 ? "Yes" : "No") << endl;
}
// ある商品の列があった時、1枚の割引券の使い道で最適なのは最も高価なものに使用することである。
// その後の選択は上記と全く同じ問題であるから、貪欲法で解くことができる。
void D() {
	read(int, N);
	read(int, M);
	auto pQueue = priority_queue<int>();
	int price;
	for (size_t i = 0; i < N; i++) {
		cin >> price;
		pQueue.push(price);
	}
	for (auto i = 0; i < M; i++) {
		auto p = pQueue.top();
		pQueue.pop();
		pQueue.push(p / 2);
	}
	ll sum = 0;
	while (!pQueue.empty()) {
		sum += pQueue.top();
		pQueue.pop();
	}
	cout << sum << endl;
}

void E() {}
void F() {}

int main(){
	D();
}

Measured memory_bytes: 3908