#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3fffffff;
const long long mod = 1000000007;
const int maxn = 3e5 + 10;
int a[maxn];
int n, k;
struct node {
  int l, r;
  pair<int, int> v;
} seg[maxn * 4];
void up(int i) {
  if (seg[i].l != seg[i].r) {
    seg[i].v = max(seg[i * 2].v, seg[i * 2 + 1].v);
  }
}
void build(int i, int l, int r) {
  seg[i].l = l, seg[i].r = r;
  if (l == r) {
    seg[i].v = make_pair(a[l], l);
    return;
  }
  int m = (l + r) / 2;
  build(i * 2, l, m);
  build(i * 2 + 1, m + 1, r);
  up(i);
}
pair<int, int> query(int i, int l, int r) {
  if (seg[i].l == l && seg[i].r == r) {
    return seg[i].v;
  }
  int m = (seg[i].l + seg[i].r) / 2;
  if (r <= m)
    return query(i * 2, l, r);
  else if (l > m)
    return query(i * 2 + 1, l, r);
  else {
    return max(query(i * 2, l, m), query(i * 2 + 1, m + 1, r));
  }
}
void update(int i, int p) {
  if (seg[i].l == seg[i].r) {
    seg[i].v.first = 0;
    return;
  }
  int m = (seg[i].l + seg[i].r) / 2;
  if (p <= m)
    update(i * 2, p);
  else
    update(i * 2 + 1, p);
  up(i);
}
int p[maxn];
int main() {
  scanf("%d%d", &n, &k);
  long long sum = 0;
  for (int i = 1; i < n + 1; i++) scanf("%d", &a[i]);
  build(1, 1, n);
  for (int i = 1; i < n + 1; i++) {
    int t = i + k;
    t = min(n, t);
    pair<int, int> res = query(1, 1, t);
    update(1, res.second);
    p[res.second] = i + k;
  }
  for (int i = 1; i < n + 1; i++) sum += 1ll * (p[i] - i) * a[i];
  printf("%lld\n", sum);
  for (int i = 1; i < n + 1; i++) printf("%d ", p[i]);
  puts("");
  return 0;
}
