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')
}
}