Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "sort"8)9 1011func CF246E(_r io.Reader, _w io.Writer) {12 in := bufio.NewReader(_r)13 out := bufio.NewWriter(_w)14 defer out.Flush()15 16 var n, v, t, q, d int17 Fscan(in, &n)18 g := make([][]int, n)19 roots := []int{}20 a := make([]string, n)21 for w := 0; w < n; w++ {22 Fscan(in, &a[w], &v)23 if v > 0 {24 g[v-1] = append(g[v-1], w)25 } else {26 roots = append(roots, w)27 }28 }29 30 type info struct{ in, out, d int }31 is := make([]info, n)32 depT := make([][]int, n)33 rows := make([][]string, n)34 var f func(v, p, d int)35 f = func(v, p, d int) {36 t++37 is[v].in = t38 is[v].d = d39 depT[d] = append(depT[d], t)40 rows[d] = append(rows[d], a[v])41 for _, w := range g[v] {42 if w != p {43 f(w, v, d+1)44 }45 }46 is[v].out = t47 }48 for _, root := range roots {49 f(root, -1, 0)50 }51 52 Fscan(in, &q)53 type query struct{ l, r, i int }54 qus := make([][]query, n)55 for i := 0; i < q; i++ {56 Fscan(in, &v, &d)57 nf := is[v-1]58 if d += nf.d; d < n {59 l := sort.SearchInts(depT[d], nf.in)60 r := sort.SearchInts(depT[d], nf.out+1)61 qus[d] = append(qus[d], query{l, r, i})62 }63 }64 ans := make([]int, q)65 var tree []int66 add := func(i, v int) {67 for i++; i < len(tree); i += i & -i {68 tree[i] += v69 }70 }71 sum := func(i int) (res int) {72 for ; i > 0; i &= i - 1 {73 res += tree[i]74 }75 return76 }77 for i, qs := range qus {78 row := rows[i]79 tree = make([]int, len(row)+1)80 j, posR := 0, map[string]int{}81 sort.Slice(qs, func(i, j int) bool { return qs[i].r < qs[j].r })82 for _, q := range qs {83 for ; j < q.r; j++ {84 if p, ok := posR[row[j]]; ok {85 add(p, -1)86 }87 add(j, 1)88 posR[row[j]] = j89 }90 ans[q.i] = sum(q.r) - sum(q.l)91 }92 }93 for _, v := range ans {94 Fprintln(out, v)95 }96}97 9899