For problem statement at 1000-1999/1400-1499/1440-1449/1443/problemE.txt this is a correct solution, but verifier at 1000-1999/1400-1499/1440-1449/1443/verifierE.go ends with reference error on test 1: exit status 2
panic: runtime error: index out of range [5] with length 2
goroutine 1 [running]:
main.main()
/home/ubuntu/codeforces/1000-1999/1400-1499/1440-1449/1443/1443E.go:88 +0x908
exit status 1 can you fix the verifier? package main
import (
"bufio"
"os"
"strconv"
)
func readInt(in *bufio.Reader) int64 {
var n int64
var c byte
for {
c, _ = in.ReadByte()
if c >= '0' && c <= '9' {
break
}
}
for {
n = n*10 + int64(c-'0')
c, _ = in.ReadByte()
if c < '0' || c > '9' {
break
}
}
return n
}
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
n := int(readInt(in))
q := int(readInt(in))
K := n
if K > 15 {
K = 15
}
fact := make([]int64, 16)
fact[0] = 1
for i := int64(1); i <= 15; i++ {
fact[i] = fact[i-1] * i
}
getPerm := func(R int64) []int {
avail := make([]int, K)
for i := 0; i < K; i++ {
avail[i] = i + 1
}
perm := make([]int, K)
for i := 0; i < K; i++ {
f := fact[K-1-i]
idx := R / f
R %= f
perm[i] = avail[idx]
copy(avail[idx:], avail[idx+1:])
avail = avail[:len(avail)-1]
}
return perm
}
var R int64 = 0
perm := getPerm(R)
sum := func(idx int) int64 {
if idx == 0 {
return 0
}
if idx <= n-K {
return int64(idx) * int64(idx+1) / 2
}
S := int64(n-K) * int64(n-K+1) / 2
count := idx - (n - K)
for i := 0; i < count; i++ {
S += int64(n-K) + int64(perm[i])
}
return S
}
for i := 0; i < q; i++ {
t := int(readInt(in))
if t == 1 {
l := int(readInt(in))
r := int(readInt(in))
ans := sum(r) - sum(l-1)
out.WriteString(strconv.FormatInt(ans, 10))
out.WriteByte('\n')
} else {
x := readInt(in)
R += x
perm = getPerm(R)
}
}
}