For problem statement at 0-999/400-499/440-449/444/problemB.txt this is a correct solution, but verifier at 0-999/400-499/440-449/444/verifierB.go ends with case 1 failed: pos 0 expected 2 got -1
input:
2 1 687860503
exit status 1 can you fix the verifier? package main
import (
"bufio"
"fmt"
"math/bits"
"os"
"strconv"
)
const mod int64 = 1000000007
func main() {
in := bufio.NewReaderSize(os.Stdin, 1<<20)
var n, d int
var x int64
fmt.Fscan(in, &n, &d, &x)
a := make([]int, n)
pos := make([]int, n+1)
for i := 0; i < n; i++ {
a[i] = i + 1
pos[i+1] = i
x = (x*37 + 10007) % mod
j := int(x % int64(i+1))
if i != j {
vi, vj := a[i], a[j]
a[i], a[j] = vj, vi
pos[vi], pos[vj] = j, i
}
}
bArr := make([]byte, n)
for i := 0; i < d; i++ {
bArr[i] = 1
}
for i := 0; i < n; i++ {
x = (x*37 + 10007) % mod
j := int(x % int64(i+1))
bArr[i], bArr[j] = bArr[j], bArr[i]
}
m := (n + 63) >> 6
B := make([]uint64, m)
minOne := n
for i := 0; i < n; i++ {
if bArr[i] != 0 {
B[i>>6] |= uint64(1) << uint(i&63)
if minOne == n {
minOne = i
}
}
}
ans := make([]int, n)
for i := 0; i < n; i++ {
ans[i] = -1
}
if minOne < n {
U := make([]uint64, m)
for i := minOne; i < n; i++ {
U[i>>6] |= uint64(1) << uint(i&63)
}
remaining := n - minOne
for v := n; v >= 1 && remaining > 0; v-- {
p := pos[v]
ws := p >> 6
bs := uint(p & 63)
if bs == 0 {
src := 0
for w := ws; w < m; w++ {
inter := U[w] & B[src]
if inter != 0 {
U[w] &^= inter
remaining -= bits.OnesCount64(inter)
base := w << 6
for inter != 0 {
tz := bits.TrailingZeros64(inter)
ans[base+tz] = v - 1
inter &= inter - 1
}
}
src++
}
} else {
rsh := 64 - bs
var prev uint64
src := 0
for w := ws; w < m; w++ {
cur := B[src]
shifted := (cur << bs) | prev
prev = cur >> rsh
inter := U[w] & shifted
if inter != 0 {
U[w] &^= inter
remaining -= bits.OnesCount64(inter)
base := w << 6
for inter != 0 {
tz := bits.TrailingZeros64(inter)
ans[base+tz] = v - 1
inter &= inter - 1
}
}
src++
}
}
}
}
out := bufio.NewWriterSize(os.Stdout, 1<<20)
buf := make([]byte, 0, 32)
for i := 0; i < n; i++ {
buf = strconv.AppendInt(buf[:0], int64(ans[i]), 10)
out.Write(buf)
out.WriteByte('\n')
}
out.Flush()
}