```go
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
reader := bufio.NewReader(os.Stdin)
var n, d int
var x int64
fmt.Fscan(reader, &n, &d, &x)
a := make([]int, n)
b := make([]int, n)
for i := 0; i < n; i++ {
a[i] = i + 1
}
for i := 0; i < n; i++ {
x = (x*37 + 10007) % 1000000007
j := int(x % int64(i+1))
a[i], a[j] = a[j], a[i]
}
for i := 0; i < n; i++ {
if i < d {
b[i] = 1
} else {
b[i] = 0
}
}
for i := 0; i < n; i++ {
x = (x*37 + 10007) % 1000000007
j := int(x % int64(i+1))
b[i], b[j] = b[j], b[i]
}
pos := make([]int, n+1)
for i := 0; i < n; i++ {
pos[a[i]] = i
}
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
if d < 400 {
ones := make([]int, 0, d)
for i := 0; i < n; i++ {
if b[i] == 1 {
ones = append(ones, i)
}
}
for i := 0; i < n; i++ {
if len(ones) == 0 || i < ones[0] {
writer.WriteString("-1\n")
continue
}
maxVal := 0
for _, p := range ones {
if p > i {
break
}
if a[i-p] > maxVal {
maxVal = a[i-p]
}
}
writer.WriteString(strconv.Itoa(maxVal-1) + "\n")
}
} else {
firstOne := -1
for j := 0; j < n; j++ {
if b[j] == 1 {
firstOne = j
break
}
}
for i := 0; i < n; i++ {
if firstOne == -1 || i < firstOne {
writer.WriteString("-1\n")
continue
}
maxVal := 0
for v := n; v >= 1; v-- {
p := pos[v]
if p <= i && b[i-p] == 1 {
maxVal = v
break
}
}
writer.WriteString(strconv.Itoa(maxVal-1) + "\n")
}
}
}
```