```go
package main
import (
"bufio"
"fmt"
"io"
"math"
"os"
)
type Query struct {
s, d, k int
idx int
}
func main() {
data, _ := io.ReadAll(os.Stdin)
p := 0
nextInt := func() int {
sign := 1
val := 0
n := len(data)
for p < n {
c := data[p]
if c > ' ' {
break
}
p++
}
if p < n && data[p] == '-' {
sign = -1
p++
}
for p < n {
c := data[p]
if c < '0' || c > '9' {
break
}
val = val*10 + int(c-'0')
p++
}
return sign * val
}
t := nextInt()
out := bufio.NewWriterSize(os.Stdout, 1<<20)
defer out.Flush()
for tc := 0; tc < t; tc++ {
n := nextInt()
q := nextInt()
a := make([]int64, n)
for i := 0; i < n; i++ {
a[i] = int64(nextInt())
}
groups := make([][]Query, n+1)
for i := 0; i < q; i++ {
s := nextInt()
d := nextInt()
k := nextInt()
groups[d] = append(groups[d], Query{s: s - 1, d: d, k: k, idx: i})
}
ans := make([]int64, q)
B := int(math.Sqrt(float64(n)))
if B < 1 {
B = 1
}
for d := B + 1; d <= n; d++ {
if len(groups[d]) == 0 {
continue
}
for _, qu := range groups[d] {
s0 := qu.s
res := int64(0)
pos := s0
for i := 0; i < qu.k; i++ {
res += int64(i+1) * a[pos]
pos += d
}
ans[qu.idx] = res
}
}
for d := 1; d <= B; d++ {
if len(groups[d]) == 0 {
continue
}
S := make([][]int64, d)
W := make([][]int64, d)
for r := 0; r < d; r++ {
if r >= n {
S[r] = []int64{0}
W[r] = []int64{0}
continue
}
L := (n-1-r)/d + 1
Sr := make([]int64, L+1)
Wr := make([]int64, L+1)
idx := 0
for pos := r; pos < n; pos += d {
val := a[pos]
Sr[idx+1] = Sr[idx] + val
Wr[idx+1] = Wr[idx] + int64(idx+1)*val
idx++
}
S[r] = Sr
W[r] = Wr
}
for _, qu := range groups[d] {
s0 := qu.s
r := s0 % d
t0 := s0 / d
Sr := S[r]
Wr := W[r]
tk := t0 + qu.k
res := (Wr[tk] - Wr[t0]) - int64(t0)*(Sr[tk]-Sr[t0])
ans[qu.idx] = res
}
}
for i := 0; i < q; i++ {
if i > 0 {
fmt.Fprint(out, " ")
}
fmt.Fprint(out, ans[i])
}
fmt.Fprintln(out)
}
}
```