// #E // yukicoder no.489 main.go package main import ( "bufio" "fmt" "io" "os" "sort" ) type mock struct { day int value int } func searching(data1, data2 []mock, window int) (int, int, int) { max, buy, sell := int(-1e9), -1, -1 for high := range data2 { for low := range data1 { if data2[high].value <= data1[low].value { break } if data1[low].day < data2[high].day && data2[high].day <= data1[low].day+window { tmp := data2[high].value - data1[low].value if max == tmp { if data1[low].day == buy { if data2[high].day < sell { sell = data2[high].day continue } } if data1[low].day < buy { buy, sell = data1[low].day, data2[high].day } } if max < tmp { max, buy, sell = tmp, data1[low].day, data2[high].day } } } } return max, buy, sell } func solve(in io.Reader, out, err io.Writer) { day, window, origin := 0, 0, 0 value, buy, sell := 0, 0, 0 fmt.Fscan(in, &day, &window, &origin) data1 := make([]mock, day) data2 := make([]mock, day) for i := range data1 { temp := 0 fmt.Fscan(in, &temp) data1[i].day = i data1[i].value = temp data2[i].day = i data2[i].value = temp } sort.Slice(data1, func(i, j int) bool { return data1[i].value < data1[j].value }) sort.Slice(data2, func(i, j int) bool { return data2[i].value > data2[j].value }) tempV, buy, sell := searching(data1, data2, window) if tempV < 0 { tempV = 0 } value = origin * tempV fmt.Fprintln(out, value) if value != 0 { fmt.Fprintln(out, buy, sell) } } func main() { br := bufio.NewReaderSize(os.Stdin, int(1e7)) solve(br, os.Stdout, os.Stderr) }