#include <bits/stdc++.h>
#define ll long long
ll n, d, ans, sum, left, right, result, happy[50010], day[50010];
bool check(ll target)
{
ans = 0;
sum = 0;
for (int i = 1; i <= d; i++)
{
ans >>= 1;
while (ans < target)
{
sum++;
ans += happy[sum];
day[sum] = i;
if (sum > n)
return false;
}
}
if (sum < n)
{
for (int i = sum+1; i <= n; i++)//sum这个巧克力已经吃过了, 所以要换下一个
day[i] = d;
}
return true;
}
int main(void)
{
scanf("%d %d", &n, &d);
left = 0;
right = 0;
for (int i = 1; i <= n; i++)
{
scanf("%lld", &happy[i]);
right += happy[i];
}
while (left < right)
{
ll mid = left + right + 1 >> 1;
if (check(mid))
{
left = mid;
result = mid;
}
else
right = mid -1;
}
check(result);
printf("%lld\n", result);
for (int i = 1; i <= n; i++)
printf("%lld\n", day[i]);
return 0;
}
//二分幸福值,判定该值是否可行
虽然在看了很多大佬后,终于找到最适合自己的一条思路做了,但还是不理解为什么要在最后再check一次,求教各位大佬