```go
package main
import (
"bufio"
"os"
"sort"
"strconv"
)
type FastScanner struct {
r *bufio.Reader
buf [8192]byte
idx int
n int
}
func NewFastScanner() *FastScanner {
return &FastScanner{r: bufio.NewReader(os.Stdin)}
}
func (fs *FastScanner) NextInt() int {
for {
if fs.idx >= fs.n {
fs.n, _ = fs.r.Read(fs.buf[:])
fs.idx = 0
}
if fs.idx < fs.n && fs.buf[fs.idx] >= '0' {
break
}
fs.idx++
}
val := 0
for fs.idx < fs.n && fs.buf[fs.idx] >= '0' {
val = val*10 + int(fs.buf[fs.idx]-'0')
fs.idx++
}
return val
}
type SubQuery struct {
l, r int
k int64
idx int
sign int64
}
func main() {
fs := NewFastScanner()
n := fs.NextInt()
m := fs.NextInt()
dist := make([]int64, n+1)
for i := 1; i < n; i++ {
w := int64(fs.NextInt())
v := i + 1
parent := v / 2
dist[v] = dist[parent] + w
}
tin := make([]int, n+1)
tout := make([]int, n+1)
euler := make([]int, n+1)
timer := 0
type StackItem struct {
u int
state int
}
stack := []StackItem{{1, 0}}
for len(stack) > 0 {
top := &stack[len(stack)-1]
u := top.u
if top.state == 0 {
timer++
tin[u] = timer
euler[timer] = u
top.state = 1
if 2*u+1 <= n {
stack = append(stack, StackItem{2*u + 1, 0})
}
if 2*u <= n {
stack = append(stack, StackItem{2*u, 0})
}
} else {
tout[u] = timer
stack = stack[:len(stack)-1]
}
}
elements := make([]struct {
val int64
pos int
}, n)
for i := 1; i <= n; i++ {
elements[i-1] = struct {
val int64
pos int
}{dist[euler[i]], i}
}
sort.Slice(elements, func(i, j int) bool {
return elements[i].val < elements[j].val
})
maxSub := m * 40
subQueries := make([]SubQuery, 0, maxSub)
answers := make([]int64, m)
for q := 0; q < m; q++ {
A := fs.NextInt()
H := int64(fs.NextInt())
cur := A
prev := 0
for cur > 0 {
K := H - dist[A] + 2*dist[cur]
if K < 0 {
break
}
l, r := tin[cur], tout[cur]
subQueries = append(subQueries, SubQuery{l, r, K, q, 1})
if prev != 0 {
l2, r2 := tin[prev], tout[prev]
subQueries = append(subQueries, SubQuery{l2, r2, K, q, -1})
}
prev = cur
cur = cur / 2
}
}
sort.Slice(subQueries, func(i, j int) bool {
return subQueries[i].k < subQueries[j].k
})
bitCnt := make([]int, n+2)
bitSum := make([]int64, n+2)
add := func(idx int, c int, s int64) {
for idx <= n {
bitCnt[idx] += c
bitSum[idx] += s
idx += idx & -idx
}
}
query := func(idx int) (int, int64) {
var c int
var s int64
for idx > 0 {
c += bitCnt[idx]
s += bitSum[idx]
idx -= idx & -idx
}
return c, s
}
rangeQuery := func(l, r int) (int, int64) {
if l > r {
return 0, 0
}
c1, s1 := query(r)
c2, s2 := query(l - 1)
return c1 - c2, s1 - s2
}
ptr := 0
for _, sq := range subQueries {
for ptr < n && elements[ptr].val < sq.k {
add(elements[ptr].pos, 1, elements[ptr].val)
ptr++
}
cnt, sum := rangeQuery(sq.l, sq.r)
answers[sq.idx] += sq.sign * (sq.k*int64(cnt) - sum)
}
writer := bufio.NewWriter(os.Stdout)
for i := 0; i < m; i++ {
writer.WriteString(strconv.FormatInt(answers[i], 10))
writer.WriteByte('\n')
}
writer.Flush()
}
```