For problem statement at 0-999/100-199/160-169/160/problemE.txt this is a correct solution, but verifier at 0-999/100-199/160-169/160/verifierE.go ends with panic: invalid argument to Intn
goroutine 1 [running]:
math/rand.(*Rand).Intn(0x1ef320?, 0x1ef858?)
/usr/local/go/src/math/rand/rand.go:180 +0x64
math/rand.Intn(0x0)
/usr/local/go/src/math/rand/rand.go:464 +0x28
main.main()
/home/ubuntu/codeforces/0-999/100-199/160-169/160/verifierE.go:43 +0x678
exit status 2 can you fix the verifier? ```go
package main
import (
"io"
"os"
"sort"
"strconv"
)
type Bus struct {
s int
f int
t int
id int
}
type Node struct {
s []int
f []int
}
var (
tree []Node
buses []Bus
times []int
size int
nBus int
needPos int
needL int
needR int
)
func nextInt(data []byte, p *int) int {
n := len(data)
for *p < n && (data[*p] < '0' || data[*p] > '9') {
*p++
}
val := 0
for *p < n && data[*p] >= '0' && data[*p] <= '9' {
val = val*10 + int(data[*p]-'0')
*p++
}
return val
}
func lowerBound(a []int, x int) int {
l, r := 0, len(a)
for l < r {
m := (l + r) >> 1
if a[m] < x {
l = m + 1
} else {
r = m
}
}
return l
}
func upperBound(a []int, x int) int {
l, r := 0, len(a)
for l < r {
m := (l + r) >> 1
if a[m] <= x {
l = m + 1
} else {
r = m
}
}
return l
}
func exists(node int) bool {
if len(tree[node].s) == 0 {
return false
}
idx := upperBound(tree[node].s, needL) - 1
return idx >= 0 && tree[node].f[idx] >= needR
}
func findFirst(node, nl, nr int) int {
if nr < needPos || len(tree[node].s) == 0 {
return -1
}
if !exists(node) {
return -1
}
if nl == nr {
if nl < nBus {
return buses[nl].id
}
return -1
}
mid := (nl + nr) >> 1
res := findFirst(node<<1, nl, mid)
if res != -1 {
return res
}
return findFirst(node<<1|1, mid+1, nr)
}
func main() {
data, _ := io.ReadAll(os.Stdin)
p := 0
n := nextInt(data, &p)
m := nextInt(data, &p)
nBus = n
buses = make([]Bus, n)
for i := 0; i < n; i++ {
s := nextInt(data, &p)
f := nextInt(data, &p)
t := nextInt(data, &p)
buses[i] = Bus{s: s, f: f, t: t, id: i + 1}
}
sort.Slice(buses, func(i, j int) bool {
return buses[i].t < buses[j].t
})
times = make([]int, n)
for i := 0; i < n; i++ {
times[i] = buses[i].t
}
size = 1
for size < n {
size <<= 1
}
tree = make([]Node, size<<1)
for i := 0; i < n; i++ {
idx := size + i
tree[idx].s = []int{buses[i].s}
tree[idx].f = []int{buses[i].f}
}
for i := size - 1; i >= 1; i-- {
left := tree[i<<1]
right := tree[i<<1|1]
total := len(left.s) + len(right.s)
if total == 0 {
continue
}
sArr := make([]int, total)
fArr := make([]int, total)
a, b, k := 0, 0, 0
for a < len(left.s) && b < len(right.s) {
if left.s[a] <= right.s[b] {
sArr[k] = left.s[a]
fArr[k] = left.f[a]
a++
} else {
sArr[k] = right.s[b]
fArr[k] = right.f[b]
b++
}
k++
}
for a < len(left.s) {
sArr[k] = left.s[a]
fArr[k] = left.f[a]
a++
k++
}
for b < len(right.s) {
sArr[k] = right.s[b]
fArr[k] = right.f[b]
b++
k++
}
tree[i].s = sArr
tree[i].f = fArr
}
for i := 1; i < len(tree); i++ {
for j := 1; j < len(tree[i].f); j++ {
if tree[i].f[j] < tree[i].f[j-1] {
tree[i].f[j] = tree[i].f[j-1]
}
}
}
out := make([]byte, 0, m*6)
for i := 0; i < m; i++ {
l := nextInt(data, &p)
r := nextInt(data, &p)
b := nextInt(data, &p)
ans := -1
pos := lowerBound(times, b)
if pos < n {
needPos = pos
needL = l
needR = r
ans = findFirst(1, 0, size-1)
}
if i > 0 {
out = append(out, ' ')
}
out = strconv.AppendInt(out, int64(ans), 10)
}
out = append(out, '\n')
_, _ = os.Stdout.Write(out)
}
```