const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal: false
});
// 全局常量(与原C++一致)
const delta = 2010;
const INF = 1e9 + 10;
let a = []; // 存储操作距离(1-based)
// 读取输入并执行
let lines = [];
rl.on('line', (line) => {
lines.push(line.trim());
});
rl.on('close', () => {
solve();
});
function solve() {
// 修复输入读取逻辑
let ptr = 0;
const [n, x] = lines[ptr++].split(' ').map(Number);
const aInput = lines[ptr++].split(' ').map(Number); // 第二行是n个a[i]
a = [0]; // 1-based 索引
for (let i = 0; i < n; i++) {
a.push(aInput[i]);
}
// 优化:用Map存储每行可达状态(key=位置j,value={minDist: 最小距离, op: 操作类型})
let prevDP = new Map();
const initialJ = delta + x;
prevDP.set(initialJ, { minDist: 0, op: -1 }); // 初始状态:0次操作,位置initialJ,距离0
// 存储回溯信息:dp[i][j] = { prevJ: 前一个位置, op: 操作类型 }
const backtrack = new Array(n + 1).fill(0).map(() => new Map());
// DP状态转移(前i次操作 → 前i+1次操作)
for (let i = 0; i < n; i++) {
const currDP = new Map();
const currentA = a[i + 1]; // 第i+1次操作的距离
// 遍历前i次的所有可达状态
for (const [j, { minDist }] of prevDP) {
// 选择1:向右移动(j + currentA)
const j1 = j + currentA;
const dist1 = minDist + currentA;
if (j1 < 4050) { // 限制范围,避免越界
if (!currDP.has(j1) || dist1 < currDP.get(j1).minDist) {
currDP.set(j1, { minDist: dist1, op: 1 });
backtrack[i + 1].set(j1, { prevJ: j, op: 1 });
}
}
// 选择2:不动(j)
const dist2 = minDist;
if (!currDP.has(j) || dist2 < currDP.get(j).minDist) {
currDP.set(j, { minDist: dist2, op: 0 });
backtrack[i + 1].set(j, { prevJ: j, op: 0 });
}
// 选择3:向左移动(j - currentA)
const j2 = j - currentA;
const dist3 = minDist + currentA;
if (j2 >= 0) { // 限制范围,避免越界
if (!currDP.has(j2) || dist3 < currDP.get(j2).minDist) {
currDP.set(j2, { minDist: dist3, op: -1 });
backtrack[i + 1].set(j2, { prevJ: j, op: -1 });
}
}
}
prevDP = currDP;
}
// 最终目标位置:delta(原点)
const targetJ = delta;
let totalDist;
let reachable = prevDP.has(targetJ) && prevDP.get(targetJ).minDist <= 1e7;
if (!reachable) {
// 无法到达原点,输出所有操作和+顺序1~n
totalDist = a.slice(1).reduce((acc, val) => acc + val, 0);
console.log(totalDist);
console.log(Array.from({ length: n }, (_, i) => i + 1).join(' '));
return;
}
// 可到达原点,获取最小总距离
totalDist = prevDP.get(targetJ).minDist;
console.log(totalDist);
// 回溯操作顺序(从n次操作→0次操作)
const xx = []; // 不动的操作
const yy = []; // 向右移动的操作
const zz = []; // 向左移动的操作
let ax = n;
let ay = targetJ;
while (ax > 0) {
const { prevJ, op } = backtrack[ax].get(ay);
if (op === 0) {
xx.push(ax);
} else if (op === 1) {
yy.push(ax);
} else {
zz.push(ax);
}
ay = prevJ;
ax--;
}
// 拼接操作顺序(与原C++逻辑一致)
const order = [];
let currentPos = delta + x; // 初始位置
while (currentPos !== delta) {
if (currentPos < delta) {
const op = yy.pop();
order.push(op);
currentPos += a[op];
} else {
const op = zz.pop();
order.push(op);
currentPos -= a[op];
}
}
while (xx.length > 0) {
order.push(xx.pop());
}
// 输出操作顺序(确保是n个元素的排列)
console.log(order.join(' '));
}