Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 "container/heap"6 . "fmt"7 "io"8 "sort"9)10 1112func CF1374E2(_r io.Reader, out io.Writer) {13 in := bufio.NewReader(_r)14 min := func(a, b int) int {15 if a > b {16 return b17 }18 return a19 }20 max := func(a, b int) int {21 if b > a {22 return b23 }24 return a25 }26 27 var n, m, k, t, t0, t1, s int28 g := [4][]pair74{}29 Fscan(in, &n, &m, &k)30 for i := 1; i <= n; i++ {31 Fscan(in, &t, &t0, &t1)32 x := t0<<1 | t133 g[x] = append(g[x], pair74{t, i})34 }35 trash, a, b, both := g[0], g[1], g[2], g[3]36 if len(a) > len(b) {37 a, b = b, a38 }39 na, nb := len(a), len(both)40 if na+nb < k || nb < k*2-m {41 Fprint(out, -1)42 return43 }44 45 Sort := func(a []pair74) { sort.Slice(a, func(i, j int) bool { return a[i].t < a[j].t }) }46 Sort(a)47 Sort(b)48 limitNa := min(m/2, m-k)49 if na > limitNa {50 trash = append(append(trash, a[limitNa:]...), b[limitNa:]...)51 a = a[:limitNa]52 b = b[:limitNa]53 na = limitNa54 } else {55 trash = append(trash, b[na:]...)56 b = b[:na]57 }58 for i, p := range a {59 s += p.t + b[i].t60 }61 62 Sort(both)63 b0 := max(max(k-na, 0), m-2*na-len(trash))64 for _, p := range both[:b0] {65 s += p.t66 }67 68 Sort(trash)69 h := maxMinHeap{&maxHp{}, &minHp{}}70 for _, p := range trash[:m-2*na-b0] {71 h.left.push(p)72 }73 for _, p := range trash[m-2*na-b0:] {74 h.right.push(p)75 }76 77 s0 := s78 tmp := minHp(append([]pair74{}, *h.right...))79 h0 := maxMinHeap{&maxHp{append(h.left.a[:0:0], h.left.a...), h.left.s}, &tmp}80 81 ans := s + h.left.s82 for i := na - 1; i >= k; i-- {83 s -= a[i].t + b[i].t84 h.push(a[i])85 h.push(b[i])86 ans = min(ans, s+h.left.s)87 }88 89 if len(both) > m {90 both = both[:m]91 }92 for j, p := range both[b0:] {93 s += p.t94 i := min(na, k) - 1 - j95 if i >= 0 {96 s -= a[i].t + b[i].t97 h.push(a[i])98 h.push(b[i])99 }100 h.l2r()101 ans = min(ans, s+h.left.s)102 }103 Fprintln(out, ans)104 105 output := func() {106 for _, p := range a {107 Fprint(out, p.i, " ")108 }109 for _, p := range b {110 Fprint(out, p.i, " ")111 }112 for _, p := range both {113 Fprint(out, p.i, " ")114 }115 for _, p := range h.left.a {116 Fprint(out, p.i, " ")117 }118 }119 120 s = s0121 h = h0122 123 if s+h.left.s == ans {124 both = both[:b0]125 output()126 return127 }128 129 for i := na - 1; i >= k; i-- {130 s -= a[i].t + b[i].t131 h.push(a[i])132 h.push(b[i])133 if s+h.left.s == ans {134 a = a[:i]135 b = b[:i]136 both = both[:b0]137 output()138 return139 }140 }141 142 for j, p := range both[b0:] {143 s += p.t144 i := min(na, k) - 1 - j145 if i >= 0 {146 s -= a[i].t + b[i].t147 h.push(a[i])148 h.push(b[i])149 }150 h.l2r()151 if s+h.left.s == ans {152 if i > 0 {153 a = a[:i]154 b = b[:i]155 } else {156 a = nil157 b = nil158 }159 both = both[:b0+j+1]160 output()161 return162 }163 }164}165 166167 168type maxMinHeap struct {169 left *maxHp170 right *minHp171}172 173func (h maxMinHeap) push(v pair74) { h.left.push(h.right.pushPop(v)) }174func (h maxMinHeap) l2r() { h.right.push(heap.Pop(h.left).(pair74)) }175func (h maxMinHeap) r2l() { h.left.push(heap.Pop(h.right).(pair74)) }176 177type pair74 struct{ t, i int }178type maxHp struct {179 a []pair74180 s int181}182 183func (h maxHp) Len() int { return len(h.a) }184func (h maxHp) Less(i, j int) bool { return h.a[i].t > h.a[j].t }185func (h maxHp) Swap(i, j int) { h.a[i], h.a[j] = h.a[j], h.a[i] }186func (h *maxHp) Push(v interface{}) { h.s += v.(pair74).t; h.a = append(h.a, v.(pair74)) }187func (h *maxHp) Pop() interface{} { v := h.a[len(h.a)-1]; h.s -= v.t; h.a = h.a[:len(h.a)-1]; return v }188func (h *maxHp) push(v pair74) { heap.Push(h, v) }189func (h *maxHp) pushPop(v pair74) pair74 {190 if h.Len() > 0 && v.t < h.a[0].t {191 h.s += v.t - h.a[0].t192 v, h.a[0] = h.a[0], v193 heap.Fix(h, 0)194 }195 return v196}197 198type minHp []pair74199 200func (h minHp) Len() int { return len(h) }201func (h minHp) Less(i, j int) bool { return h[i].t < h[j].t }202func (h minHp) Swap(i, j int) { h[i], h[j] = h[j], h[i] }203func (h *minHp) Push(v interface{}) { *h = append(*h, v.(pair74)) }204func (h *minHp) Pop() interface{} { a := *h; v := a[len(a)-1]; *h = a[:len(a)-1]; return v }205func (h *minHp) push(v pair74) { heap.Push(h, v) }206func (h minHp) pushPop(v pair74) pair74 {207 if h.Len() > 0 && v.t > h[0].t {208 v, h[0] = h[0], v209 heap.Fix(&h, 0)210 }211 return v212}213