← Home
```go
package main

import (
	"bufio"
	"container/heap"
	"fmt"
	"os"
	"strconv"
)

type MinHeap []int64

func (h MinHeap) Len() int           { return len(h) }
func (h MinHeap) Less(i, j int) bool { return h[i] < h[j] }
func (h MinHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }

func (h *MinHeap) Push(x interface{}) {
	*h = append(*h, x.(int64))
}

func (h *MinHeap) Pop() interface{} {
	old := *h
	n := len(old)
	x := old[n-1]
	*h = old[0 : n-1]
	return x
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	readInt := func() int64 {
		scanner.Scan()
		val, _ := strconv.ParseInt(scanner.Text(), 10, 64)
		return val
	}

	t := int(readInt())

	for i := 0; i < t; i++ {
		n := int(readInt())
		m := int(readInt())
		d := readInt()

		a := make([]int64, n)
		for j := 0; j < n; j++ {
			a[j] = readInt()
		}

		var ans int64 = 0
		var currentSum int64 = 0
		h := &MinHeap{}
		heap.Init(h)

		for j := 0; j < n; j++ {
			val := a[j]
			day := int64(j + 1)

			profit := currentSum + val - d*day
			if profit > ans {
				ans = profit
			}

			if val > 0 {
				currentSum += val
				heap.Push(h, val)
				if h.Len() > m-1 {
					removed := heap.Pop(h).(int64)
					currentSum -= removed
				}
			}
		}
		fmt.Fprintln(writer, ans)
	}
}
```