```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)
}
}
```