Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "math/bits"8 "sort"9)10 1112func CF613D(_r io.Reader, _w io.Writer) {13 in := bufio.NewReader(_r)14 out := bufio.NewWriter(_w)15 defer out.Flush()16 17 var n, v, w, ts, q, k int18 Fscan(in, &n)19 g := make([][]int, n)20 for i := 1; i < n; i++ {21 Fscan(in, &v, &w)22 v--23 w--24 g[v] = append(g[v], w)25 g[w] = append(g[w], v)26 }27 const mx = 1728 dfn := make([]int, n)29 pa := make([][mx]int, n)30 dep := make([]int, n)31 var buildPa func(int, int)32 buildPa = func(v, p int) {33 dfn[v] = ts34 ts++35 pa[v][0] = p36 for _, w := range g[v] {37 if w != p {38 dep[w] = dep[v] + 139 buildPa(w, v)40 }41 }42 }43 buildPa(0, -1)44 for i := 0; i+1 < mx; i++ {45 for v := range pa {46 if p := pa[v][i]; p != -1 {47 pa[v][i+1] = pa[p][i]48 } else {49 pa[v][i+1] = -150 }51 }52 }53 uptoDep := func(v, d int) int {54 for k := dep[v] - d; k > 0; k &= k - 1 {55 v = pa[v][bits.TrailingZeros(uint(k))]56 }57 return v58 }59 getLCA := func(v, w int) int {60 if dep[v] > dep[w] {61 v, w = w, v62 }63 w = uptoDep(w, dep[v])64 if w == v {65 return v66 }67 for i := mx - 1; i >= 0; i-- {68 if pv, pw := pa[v][i], pa[w][i]; pv != pw {69 v, w = pv, pw70 }71 }72 return pa[v][0]73 }74 75 vt := make([][]int, n)76 st := []int{0}77 imp := make([]int, n)78o:79 for Fscan(in, &q); q > 0; q-- {80 Fscan(in, &k)81 vs := make([]int, k)82 for i := range vs {83 Fscan(in, &vs[i])84 vs[i]--85 }86 sort.Slice(vs, func(i, j int) bool { return dfn[vs[i]] < dfn[vs[j]] })87 vt[0] = vt[0][:0]88 st = st[:1]89 for _, v := range vs {90 imp[v] = q91 if v == 0 {92 continue93 }94 if imp[pa[v][0]] == q {95 Fprintln(out, -1)96 continue o97 }98 vt[v] = vt[v][:0]99 lca := getLCA(st[len(st)-1], v)100 for len(st) > 1 && dfn[lca] <= dfn[st[len(st)-2]] {101 p := st[len(st)-2]102 vt[p] = append(vt[p], st[len(st)-1])103 st = st[:len(st)-1]104 }105 if lca != st[len(st)-1] {106 vt[lca] = vt[lca][:0]107 vt[lca] = append(vt[lca], st[len(st)-1])108 st[len(st)-1] = lca109 }110 st = append(st, v)111 }112 for i := 1; i < len(st); i++ {113 vt[st[i-1]] = append(vt[st[i-1]], st[i])114 }115 116 ans := 0117 var f func(int) int118 f = func(v int) int {119 res := 0120 for _, w := range vt[v] {121 res += f(w)122 }123 if imp[v] == q {124 ans += res125 return 1126 }127 if res > 1 {128 ans++129 return 0130 }131 return res132 }133 f(0)134 Fprintln(out, ans)135 }136}137 138139