Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910type xorBasis78 struct{ b, pos [30]int }11 12func (b *xorBasis78) insertRightMost(v, p int) {13 for i := len(b.b) - 1; i >= 0; i-- {14 if v>>i&1 == 0 {15 continue16 }17 if b.b[i] == 0 {18 b.b[i] = v19 b.pos[i] = p20 return21 }22 if p >= b.pos[i] {23 p, b.pos[i] = b.pos[i], p24 v, b.b[i] = b.b[i], v25 }26 v ^= b.b[i]27 }28}29 30func (b *xorBasis78) maxXor(l int) (xor int) {31 for i := len(b.b) - 1; i >= 0; i-- {32 if xor>>i&1 == 0 && b.pos[i] >= l && xor^b.b[i] > xor {33 xor ^= b.b[i]34 }35 }36 return37}38 39func CF1778E(_r io.Reader, _w io.Writer) {40 in := bufio.NewReader(_r)41 out := bufio.NewWriter(_w)42 defer out.Flush()43 44 var T, n, v, w, q, rt int45 for Fscan(in, &T); T > 0; T-- {46 Fscan(in, &n)47 a := make([]int, n)48 for i := range a {49 Fscan(in, &a[i])50 }51 g := make([][]int, n)52 for i := 1; i < n; i++ {53 Fscan(in, &v, &w)54 v--55 w--56 g[v] = append(g[v], w)57 g[w] = append(g[w], v)58 }59 60 dfnVal := make([]int, n)61 nodes := make([]struct{ dfn, size int }, n)62 dfn := -163 const mx = 1864 pa := make([][mx]int, n)65 dep := make([]int, n)66 var build func(v, p, d int) int67 build = func(v, p, d int) int {68 pa[v][0] = p69 dep[v] = d70 dfn++71 nodes[v].dfn = dfn72 dfnVal[dfn] = a[v]73 sz := 174 for _, w := range g[v] {75 if w != p {76 sz += build(w, v, d+1)77 }78 }79 nodes[v].size = sz80 return sz81 }82 build(0, -1, 0)83 for i := 0; i+1 < mx; i++ {84 for v := range pa {85 if p := pa[v][i]; p != -1 {86 pa[v][i+1] = pa[p][i]87 } else {88 pa[v][i+1] = -189 }90 }91 }92 down := func(v, to int) int {93 if dep[v] >= dep[to] {94 return -195 }96 d := dep[v] + 197 for i := 0; i < mx; i++ {98 if (dep[to]-d)>>i&1 > 0 {99 to = pa[to][i]100 }101 }102 if pa[to][0] == v {103 return to104 }105 return -1106 }107 108 Fscan(in, &q)109 type query struct{ l, i int }110 qs := make([][]query, n*2)111 for i := 0; i < q; i++ {112 Fscan(in, &rt, &v)113 if rt == v {114 qs[n-1] = append(qs[n-1], query{0, i})115 continue116 }117 rt--118 v--119 d := down(v, rt)120 var l, r int121 if d < 0 {122 o := nodes[v]123 l, r = o.dfn, o.dfn+o.size-1124 } else {125 o := nodes[d]126 l, r = o.dfn+o.size, o.dfn+n-1127 }128 qs[r] = append(qs[r], query{l, i})129 }130 131 ans := make([]int, q)132 b := &xorBasis78{}133 for r, qs := range qs {134 b.insertRightMost(dfnVal[r%n], r)135 for _, q := range qs {136 ans[q.i] = b.maxXor(q.l)137 }138 }139 for _, v := range ans {140 Fprintln(out, v)141 }142 }143}144 145146