← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
)

type FastScanner struct {
	r *bufio.Reader
}

func NewFastScanner() *FastScanner {
	return &FastScanner{r: bufio.NewReader(os.Stdin)}
}

func (fs *FastScanner) NextInt() int {
	sign := 1
	val := 0
	b, _ := fs.r.ReadByte()
	for (b < '0' || b > '9') && b != '-' {
		b, _ = fs.r.ReadByte()
	}
	if b == '-' {
		sign = -1
		b, _ = fs.r.ReadByte()
	}
	for b >= '0' && b <= '9' {
		val = val*10 + int(b-'0')
		b, _ = fs.r.ReadByte()
	}
	return val * sign
}

type BIT struct {
	n int
	t []int64
}

func NewBIT(n int) *BIT {
	return &BIT{n: n, t: make([]int64, n+5)}
}
func (b *BIT) Add(i int, v int64) {
	for i <= b.n {
		b.t[i] += v
		i += i & -i
	}
}
func (b *BIT) Sum(i int) int64 {
	res := int64(0)
	for i > 0 {
		res += b.t[i]
		i -= i & -i
	}
	return res
}
func (b *BIT) Range(l, r int) int64 {
	if r < l {
		return 0
	}
	return b.Sum(r) - b.Sum(l-1)
}

func main() {
	in := NewFastScanner()
	n := in.NextInt()
	g := make([][]int, n+1)
	for i := 0; i < n-1; i++ {
		u := in.NextInt()
		v := in.NextInt()
		g[u] = append(g[u], v)
		g[v] = append(g[v], u)
	}
	// Root the tree at 1, build children lists
	parent := make([]int, n+1)
	children := make([][]int, n+1)
	order := make([]int, 0, n)
	st := make([]int, 0, n)
	st = append(st, 1)
	parent[1] = 0
	for len(st) > 0 {
		u := st[len(st)-1]
		st = st[:len(st)-1]
		order = append(order, u)
		for _, v := range g[u] {
			if v == parent[u] {
				continue
			}
			parent[v] = u
			children[u] = append(children[u], v)
			st = append(st, v)
		}
	}
	// Euler tour tin/tout and postorder computation of maxdesc
	tin := make([]int, n+1)
	tout := make([]int, n+1)
	eul := make([]int, 0, n)
	type frame struct {
		u, it int
	}
	stack := make([]frame, 0, n*2)
	stack = append(stack, frame{1, -1})
	time := 0
	for len(stack) > 0 {
		top := &stack[len(stack)-1]
		if top.it == -1 {
			u := top.u
			time++
			tin[u] = time
			eul = append(eul, u)
			top.it = 0
		}
		u := top.u
		if top.it < len(children[u]) {
			v := children[u][top.it]
			top.it++
			stack = append(stack, frame{v, -1})
		} else {
			tout[u] = time
			stack = stack[:len(stack)-1]
		}
	}
	deg := make([]int, n+1)
	w := make([]int, n+1)
	for u := 1; u <= n; u++ {
		deg[u] = len(children[u])
		w[u] = deg[u] - 1
	}
	// maxdesc_inclusive[u] = max w[z] over subtree(u), including u
	maxdesc := make([]int, n+1)
	for i := 0; i < n; i++ {
		maxdesc[i+1] = -1 << 30
	}
	// postorder via reversed order
	for i := n - 1; i >= 0; i-- {
		u := order[i]
		mx := w[u]
		for _, v := range children[u] {
			if maxdesc[v] > mx {
				mx = maxdesc[v]
			}
		}
		maxdesc[u] = mx
	}
	// For each node, sort its children by sup=maxdesc[child] descending
	sortedChildren := make([][]int, n+1)
	for v := 1; v <= n; v++ {
		ch := children[v]
		if len(ch) == 0 {
			continue
		}
		ids := make([]int, len(ch))
		copy(ids, ch)
		sort.Slice(ids, func(i, j int) bool {
			return maxdesc[ids[i]] > maxdesc[ids[j]]
		})
		sortedChildren[v] = ids
	}
	type Query struct {
		v, k, idx int
	}
	q := in.NextInt()
	qs := make([]Query, q)
	maxK := 0
	for i := 0; i < q; i++ {
		v := in.NextInt()
		k := in.NextInt()
		qs[i] = Query{v: v, k: k, idx: i}
		if k > maxK {
			maxK = k
		}
	}
	sort.Slice(qs, func(i, j int) bool {
		if qs[i].k == qs[j].k {
			return qs[i].v < qs[j].v
		}
		return qs[i].k > qs[j].k
	})
	// Nodes sorted by w descending
	nodes := make([]int, n)
	for i := 1; i <= n; i++ {
		nodes[i-1] = i
	}
	sort.Slice(nodes, func(i, j int) bool { return w[nodes[i]] > w[nodes[j]] })
	bitCnt := NewBIT(n + 2)
	bitSum := NewBIT(n + 2)
	ptr := 0
	ans := make([]int64, q)
	for _, qu := range qs {
		k := qu.k
		for ptr < n && w[nodes[ptr]] > k {
			u := nodes[ptr]
			bitCnt.Add(tin[u], 1)
			bitSum.Add(tin[u], int64(w[u]))
			ptr++
		}
		v := qu.v
		res := int64(deg[v])
		ch := sortedChildren[v]
		if len(ch) > 0 {
			// binary search count of children with maxdesc>k
			l, r := 0, len(ch)
			for l < r {
				m := (l + r) >> 1
				if maxdesc[ch[m]] > k {
					l = m + 1
				} else {
					r = m
				}
			}
			cntCh := l
			for i := 0; i < cntCh; i++ {
				u := ch[i]
				// strict descendants range
				lr := tin[u] + 1
				rr := tout[u]
				var cnt int64 = 0
				var sumw int64 = 0
				if lr <= rr {
					cnt = bitCnt.Range(lr, rr)
					sumw = bitSum.Range(lr, rr)
				}
				val := int64(w[u]-k) + (sumw - int64(k)*cnt)
				if val > 0 {
					res += val
				}
			}
		}
		ans[qu.idx] = res
	}
	out := bufio.NewWriter(os.Stdout)
	for i := 0; i < q; i++ {
		fmt.Fprintln(out, ans[i])
	}
	out.Flush()
}
```