## https://yukicoder.me/problems/no/1536 MIN_INT = -10 ** 18 def main(): N, M = map(int, input().split()) A = list(map(int, input().split())) dp = [[[MIN_INT] * (M + 1) for _ in range(2)] for _ in range(N + 1)] prev = [[[None for _ in range(M + 1)] for _ in range(2)] for _ in range(N + 1)] dp[0][0][0] = 0 prev[0][0][0] = (-1, -1) for i in range(N): a = A[i] current_dp = dp[i] new_dp = dp[i + 1] new_prev = prev[i + 1] # 累積max cum_dp = [[(MIN_INT, -1, -1) for _ in range(M + 1)] for _ in range(2)] cums = (MIN_INT, -1, -1) for j in range(M + 1): if j % 2 == 0 and cums[0] < current_dp[0][j]: cums = (current_dp[0][j], 0, j) cum_dp[0][j] = cums cums = (MIN_INT, -1, -1) for j in range(M + 1): if j % 2 == 1 and cums[0] < current_dp[1][j]: cums = (current_dp[1][j], 1, j) cum_dp[1][j] = cums for m in range(0, M + 1): if new_dp[0][m] < cum_dp[0][m][0] + a: new_dp[0][m] = cum_dp[0][m][0] + a new_prev[0][m] = (cum_dp[0][m][1], cum_dp[0][m][2]) if m > 0: if new_dp[0][m] < cum_dp[1][m - 1][0] + a: new_dp[0][m] = cum_dp[1][m - 1][0] + a new_prev[0][m] = (cum_dp[1][m - 1][1], cum_dp[1][m - 1][2]) if new_dp[1][m] < cum_dp[1][m][0] - a: new_dp[1][m] = cum_dp[1][m][0] - a new_prev[1][m] = (cum_dp[1][m][1], cum_dp[1][m][2]) if m > 0: if new_dp[1][m] < cum_dp[0][m - 1][0] - a: new_dp[1][m] = cum_dp[0][m - 1][0] - a new_prev[1][m] = (cum_dp[0][m - 1][1], cum_dp[0][m - 1][2]) answer_value = MIN_INT end_ = None current_dp = dp[-1] for j in range(M + 1): if answer_value < current_dp[j % 2][j]: answer_value = current_dp[j % 2][j] end_ = (j % 2, j) answer = [] for _ in range(M - end_[1]): answer.append(N) for i in reversed(range(N)): end = prev[i + 1][end_[0]][end_[1]] for _ in range(end_[1] - end[1]): answer.append(i) end_ = end answer.reverse() for j in range(M): print(answer[j]) if __name__ == "__main__": main()