For problem statement at 1000-1999/1200-1299/1200-1209/1208/problemD.txt this is a correct solution, but verifier at 1000-1999/1200-1299/1200-1209/1208/verifierD.go ends with case 4 failed: expected 2 3 1 4 5 got 2 4 1 5 5
input:
5
0 3 0 9 13
exit status 1 can you fix the verifier? package main
import (
"bufio"
"fmt"
"os"
)
type Fenwick struct {
tree []int64
n int
}
func NewFenwick(size int) *Fenwick {
return &Fenwick{tree: make([]int64, size+2), n: size}
}
func (f *Fenwick) update(idx int, val int64) {
for idx <= f.n {
f.tree[idx] += val
idx += idx & -idx
}
}
func (f *Fenwick) query(idx int) int64 {
var sum int64 = 0
for idx > 0 {
sum += f.tree[idx]
idx -= idx & -idx
}
return sum
}
func main() {
in := bufio.NewReader(os.Stdin)
var n int
fmt.Fscan(in, &n)
s := make([]int64, n+1)
for i := 1; i <= n; i++ {
fmt.Fscan(in, &s[i])
}
sumFT := NewFenwick(n)
countFT := NewFenwick(n)
for i := 1; i <= n; i++ {
countFT.update(i, 1)
}
p := make([]int, n+1)
for i := n; i >= 1; i-- {
low := 1
high := n
for low < high {
mid := (low + high) / 2
t := int64(mid-1) * int64(mid) / 2
sumlt := sumFT.query(mid-1)
gg := t - s[i] - sumlt
if gg >= 0 {
high = mid
} else {
low = mid + 1
}
}
q0 := low
low = q0
high = n
for low < high {
mid := (low + high) / 2
cnt := countFT.query(mid) - countFT.query(q0-1)
if cnt >= 1 {
high = mid
} else {
low = mid + 1
}
}
r := low
p[i] = r
sumFT.update(r, int64(r))
countFT.update(r, -1)
}
for i := 1; i <= n; i++ {
fmt.Print(p[i])
if i < n {
fmt.Print(" ")
} else {
fmt.Println()
}
}
}