← Home
For problem statement at 1000-1999/1900-1999/1940-1949/1946/problemF.txt this is a correct solution, but verifier at 1000-1999/1900-1999/1940-1949/1946/verifierF.go ends with Runtime error on test 2: exit status 2

exit status 1 can you fix the verifier? package main

import (
	"bufio"
	"os"
	"strconv"
)

var (
	buffer []byte = make([]byte, 1<<16)
	bufLen int
	bufPtr int
)

func nextByte() byte {
	if bufPtr >= bufLen {
		bufPtr = 0
		bufLen, _ = os.Stdin.Read(buffer)
		if bufLen == 0 {
			return 0
		}
	}
	b := buffer[bufPtr]
	bufPtr++
	return b
}

func nextInt() int {
	b := nextByte()
	for b <= ' ' && b != 0 {
		b = nextByte()
	}
	if b == 0 {
		return 0
	}
	res := 0
	for b > ' ' {
		res = res*10 + int(b-'0')
		b = nextByte()
	}
	return res
}

var (
	bit       []int64
	dp        []int64
	pos       []int
	a         []int
	multiples []int
	head      []int
	nxt       []int
	to        []int
	qIdx      []int
	ans       []int64
)

func add(i int, val int64, n int) {
	for ; i <= n; i += i & -i {
		bit[i] += val
	}
}

func query(i int) int64 {
	var sum int64
	for ; i > 0; i -= i & -i {
		sum += bit[i]
	}
	return sum
}

func sortMultiples(m []int, pos []int) {
	n := len(m)
	if n < 12 {
		for i := 1; i < n; i++ {
			v := m[i]
			pv := pos[v]
			j := i - 1
			for ; j >= 0 && pos[m[j]] > pv; j-- {
				m[j+1] = m[j]
			}
			m[j+1] = v
		}
		return
	}
	pivot := pos[m[n/2]]
	i, j := 0, n-1
	for i <= j {
		for pos[m[i]] < pivot {
			i++
		}
		for pos[m[j]] > pivot {
			j--
		}
		if i <= j {
			m[i], m[j] = m[j], m[i]
			i++
			j--
		}
	}
	sortMultiples(m[:j+1], pos)
	sortMultiples(m[i:], pos)
}

func main() {
	t := nextInt()
	if t == 0 {
		return
	}
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	maxN := 0
	maxQ := 0

	for tc := 0; tc < t; tc++ {
		n := nextInt()
		q := nextInt()

		if n > maxN {
			for len(a) <= n {
				a = append(a, 0)
				pos = append(pos, 0)
				bit = append(bit, 0)
				dp = append(dp, 0)
				head = append(head, -1)
			}
			maxN = n
		}
		if q > maxQ {
			for len(nxt) < q {
				nxt = append(nxt, 0)
				to = append(to, 0)
				qIdx = append(qIdx, 0)
				ans = append(ans, 0)
			}
			maxQ = q
		}

		for i := 1; i <= n; i++ {
			a[i] = nextInt()
			pos[a[i]] = i
			head[i] = -1
			bit[i] = 0
		}

		for i := 0; i < q; i++ {
			l := nextInt()
			r := nextInt()
			nxt[i] = head[l]
			head[l] = i
			to[i] = r
			qIdx[i] = i
		}

		for u := n; u >= 1; u-- {
			x := a[u]
			multiples = multiples[:0]
			for z := x; z <= n; z += x {
				multiples = append(multiples, z)
			}
			sortMultiples(multiples, pos)

			dp[x] = 1
			for _, z := range multiples {
				if dp[z] == 0 {
					continue
				}
				pz := pos[z]
				for y := z * 2; y <= n; y += z {
					if pos[y] > pz {
						dp[y] += dp[z]
					}
				}
			}

			for _, z := range multiples {
				if dp[z] > 0 {
					add(pos[z], dp[z], n)
					dp[z] = 0
				}
			}

			for e := head[u]; e != -1; e = nxt[e] {
				ans[qIdx[e]] = query(to[e])
			}
		}

		for i := 0; i < q; i++ {
			out.WriteString(strconv.FormatInt(ans[i], 10))
			out.WriteByte(' ')
		}
		out.WriteByte('\n')
	}
}