```go
package main
import (
"bufio"
"fmt"
"math/bits"
"os"
"sort"
)
type Improvement struct {
id int
typ int
skill int
val int64
}
type Fraction struct {
num uint64
den uint64
id int
typ int
skill int
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
buf := make([]byte, 1024*1024)
scanner.Buffer(buf, 10*1024*1024)
scanInt := func() int {
scanner.Scan()
res := 0
for _, b := range scanner.Bytes() {
res = res*10 + int(b-'0')
}
return res
}
scanInt64 := func() int64 {
scanner.Scan()
res := int64(0)
for _, b := range scanner.Bytes() {
res = res*10 + int64(b-'0')
}
return res
}
if !scanner.Scan() {
return
}
resK := 0
for _, b := range scanner.Bytes() {
resK = resK*10 + int(b-'0')
}
k := resK
n := scanInt()
m := scanInt()
a := make([]int64, k+1)
for i := 1; i <= k; i++ {
a[i] = scanInt64()
}
bestType1 := make([]Improvement, k+1)
type2 := make([][]Improvement, k+1)
var type3 []Improvement
for j := 1; j <= n; j++ {
typ := scanInt()
skill := scanInt()
b := scanInt64()
imp := Improvement{id: j, typ: typ, skill: skill, val: b}
if typ == 1 {
if bestType1[skill].val < b {
bestType1[skill] = imp
}
} else if typ == 2 {
type2[skill] = append(type2[skill], imp)
} else if typ == 3 {
type3 = append(type3, imp)
}
}
var fractions []Fraction
for i := 1; i <= k; i++ {
var adds []Improvement
adds = append(adds, type2[i]...)
if bestType1[i].val > a[i] {
pseudo := bestType1[i]
pseudo.val = pseudo.val - a[i]
adds = append(adds, pseudo)
}
sort.Slice(adds, func(x, y int) bool {
return adds[x].val > adds[y].val
})
curr := uint64(a[i])
for _, add := range adds {
num := curr + uint64(add.val)
den := curr
fractions = append(fractions, Fraction{
num: num,
den: den,
id: add.id,
typ: add.typ,
skill: add.skill,
})
curr = num
}
}
for _, mul := range type3 {
fractions = append(fractions, Fraction{
num: uint64(mul.val),
den: 1,
id: mul.id,
typ: mul.typ,
skill: mul.skill,
})
}
sort.Slice(fractions, func(i, j int) bool {
f1 := fractions[i]
f2 := fractions[j]
hi1, lo1 := bits.Mul64(f1.num, f2.den)
hi2, lo2 := bits.Mul64(f2.num, f1.den)
if hi1 != hi2 {
return hi1 > hi2
}
return lo1 > lo2
})
take := m
if len(fractions) < m {
take = len(fractions)
}
var selected1 []int
var selected2 []int
var selected3 []int
for i := 0; i < take; i++ {
f := fractions[i]
if f.typ == 1 {
selected1 = append(selected1, f.id)
} else if f.typ == 2 {
selected2 = append(selected2, f.id)
} else if f.typ == 3 {
selected3 = append(selected3, f.id)
}
}
outw := bufio.NewWriter(os.Stdout)
defer outw.Flush()
fmt.Fprintln(outw, len(selected1)+len(selected2)+len(selected3))
var out []int
out = append(out, selected1...)
out = append(out, selected2...)
out = append(out, selected3...)
if len(out) > 0 {
for i, v := range out {
if i > 0 {
fmt.Fprint(outw, " ")
}
fmt.Fprint(outw, v)
}
fmt.Fprintln(outw)
}
}
```