using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace SplitLength
{
    class Program
    {
        static void Main(string[] args)
        {
            var array = Console.ReadLine().Split().Select(int.Parse).ToArray();
            var N = array[0];
            var M = array[1];

            var priceArray = Console.ReadLine().Split().Select(int.Parse).ToArray();
            var queue = new PriorityQueue<decimal>(priceArray.Length);
            for (int i = 0; i < priceArray.Length; i++)
            {
                queue.Enqueue(priceArray[i]);
            }

            for (int i = 0; i < M; i++)
            {
                var max = queue.Dequeue();
                queue.Enqueue(max / 2);
            }

            Console.WriteLine(queue.Sum(_ => Math.Floor(_)));
        }
        public class PriorityQueue<T> :IEnumerable<T>
            where T : IComparable<T>
        {
            private readonly bool _isDescending;
            private readonly List<T> data;

            public PriorityQueue(bool isDescending = true)
                : this(0, isDescending)
            {

            }
            public PriorityQueue(int capacity, bool isDescending = true)
            {
                this.data = new List<T>(capacity);
                _isDescending = isDescending;
            }

            public void Enqueue(T item)
            {
                data.Add(item);
                int ci = data.Count - 1; // child index; start at end
                while (ci > 0)
                {
                    int pi = (ci - 1) / 2; // parent index
                    if (Compare(data[ci], data[pi]) >= 0)
                        break; // child item is larger than (or equal) parent so we're done
                    T tmp = data[ci];
                    data[ci] = data[pi];
                    data[pi] = tmp;
                    ci = pi;
                }
            }

            public T Dequeue()
            {
                // assumes pq is not empty; up to calling code
                int li = data.Count - 1; // last index (before removal)
                T frontItem = data[0];   // fetch the front
                data[0] = data[li];
                data.RemoveAt(li);

                --li; // last index (after removal)
                int pi = 0; // parent index. start at front of pq
                while (true)
                {
                    int ci = pi * 2 + 1; // left child index of parent
                    if (ci > li)
                        break;  // no children so done
                    int rc = ci + 1;     // right child
                    if (rc <= li && Compare(data[rc], data[ci]) < 0) // if there is a rc (ci + 1), and it is smaller than left child, use the rc instead
                        ci = rc;
                    if (Compare(data[pi], data[ci]) <= 0)
                        break; // parent is smaller than (or equal to) smallest child so done
                    T tmp = data[pi];
                    data[pi] = data[ci];
                    data[ci] = tmp; // swap parent and child
                    pi = ci;
                }
                return frontItem;
            }
            private int Compare(T a, T b)
            {
                return _isDescending ? b.CompareTo(a) : a.CompareTo(b);
            }

            public T Peek()
            {
                return data[0];
            }

            public int Count()
            {
                return data.Count;
            }

            public IEnumerator<T> GetEnumerator()
            {
                for (int i = 0; i < data.Count; i++)
                {
                    yield return data[i];
                }
            }

            IEnumerator IEnumerable.GetEnumerator()
            {
                return GetEnumerator();
            }
        }
    }
}


Measured memory_bytes: 29916