#include <iostream>
using namespace std;

int main() {
	int n, m;
	cin >> n >> m;
	int* a = new int[n + 1];
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	} 
  	//注意二分的右边界,一开始想错了以为m = n那么r不会超过1e7,但是当m远小于n时r的右边界最大会到m * n
	long long l = 1, r = 1e11;
	int* eat = new int[n + 1];
	while (r > l) {
		long long mid = (r - l) / 2 + l;
		//第几块巧克力 
		int j = -1, days = 0;
		long long cnt = 0;
		while (j < n) {
			cnt >>= 1;
			while (j < n && cnt < mid) {
				j++;
				cnt += a[j];
			}
			if (j < n) days++;
		}
		if (days >= m) l = mid + 1;
		else r = mid;
	}
  	//二分过程中保留eat[]会出现因为mid = left + 1而导致存储错误的结果
	int j = -1, days = 0;
	long long cnt = 0;
	while (j < n) {
		cnt >>= 1;
		while (j < n && cnt < l - 1) {
			j++;
			eat[j] = min(days + 1, m);
			cnt += a[j];
		}
		if (j < n) days++;
	}
	cout << l - 1 << endl;
	for (int i = 0; i < n; i++) {
		cout << eat[i] <<endl;
	}
}