Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910func cf375D(_r io.Reader, _w io.Writer) {11 in := bufio.NewReader(_r)12 out := bufio.NewWriter(_w)13 defer out.Flush()14 15 var n, m, v, w, k, dfn int16 Fscan(in, &n, &m)17 a := make([]int, n)18 for i := range a {19 Fscan(in, &a[i])20 }21 g := make([][]int, n)22 for i := 1; i < n; i++ {23 Fscan(in, &v, &w)24 v--25 w--26 g[v] = append(g[v], w)27 g[w] = append(g[w], v)28 }29 type pair struct{ i, k int }30 qs := make([][]pair, n)31 for i := 0; i < m; i++ {32 Fscan(in, &v, &k)33 if k <= n {34 qs[v-1] = append(qs[v-1], pair{i, k})35 }36 }37 38 nodes := make([]struct{ l, r, hson int }, n) 39 nodeVals := make([]int, 0, n)40 var build func(int, int) int41 build = func(v, fa int) int {42 nodes[v].l = dfn43 dfn++44 nodeVals = append(nodeVals, a[v])45 size, hsz, hson := 1, 0, -146 for _, w := range g[v] {47 if w != fa {48 sz := build(w, v)49 size += sz50 if sz > hsz {51 hsz, hson = sz, w52 }53 }54 }55 nodes[v].r = nodes[v].l + size56 nodes[v].hson = hson57 return size58 }59 build(0, -1)60 61 ans := make([]int, m)62 cnt := [1e5 + 1]int{}63 cc := make([]int, n+1)64 var f func(int, int)65 f = func(v, fa int) {66 hson := nodes[v].hson67 for _, w := range g[v] {68 if w == fa || w == hson {69 continue70 }71 f(w, v)72 73 for _, x := range nodeVals[nodes[w].l:nodes[w].r] {74 cc[cnt[x]]--75 cnt[x]--76 }77 }78 if hson >= 0 {79 f(hson, v)80 81 }82 83 84 cnt[a[v]]++85 cc[cnt[a[v]]]++86 87 for _, w := range g[v] {88 if w == fa || w == hson {89 continue90 }91 for _, x := range nodeVals[nodes[w].l:nodes[w].r] {92 cnt[x]++93 cc[cnt[x]]++94 }95 }96 97 98 for _, q := range qs[v] {99 ans[q.i] = cc[q.k]100 }101 }102 f(0, -1)103 104 for _, v := range ans {105 Fprintln(out, v)106 }107}108 109110