#!/usr/bin/env python3 # Author: Dan Skýpala from math import inf n, k = map(int, input().split()) boxes = [] lids = [] for i in range(n): a, b = map(int, input().split()) boxes.append(a) lids.append(b) # states[i][j] - trojice: # - nejvyšší hodnota čaje, kterou jsme schopni zachránit # v prvních i-1 krabicích, kde poslední víko je na i+j-k-té krabici # - ze kterého předchozího j jsme stav vyrobili # - kam jsme dali víko z téhle pozice states = [[(-inf, -1, False)]*(2*k+1) for i in range(n+1)] states[0][k] = (0, -1, False) for i in range(n): if lids[i]: # umístíme víko val_max, j_max = -inf, -1 for j in range(2*k+1): if i+j-k >= n: break if states[i][j][0] > val_max: val_max = states[i][j][0] j_max = j states[i+1][j] = max(states[i+1][j], (val_max + boxes[i+j-k], j_max, i+j-k)) else: # posuneme všechny krabice o 1 dopředu states[i+1][0] = (states[i][0][0], 0, -inf) for j in range(2*k): states[i+1][j] = max(states[i+1][j], (states[i][j+1][0], j+1, -inf)) # zpětná rekonstrukce res_j = states[-1].index(max(states[-1])) print(states[-1][res_j][0]) for i in range(n, 0, -1): if states[i][res_j][2] != -inf: print(i, states[i][res_j][2]+1) res_j = states[i][res_j][1]