Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910type seg65 [][]int11 12func (seg65) merge(a, b []int) []int {13 const k = 3114 i, n := 0, len(a)15 j, m := 0, len(b)16 res := make([]int, 0, min(n+m, k))17 for len(res) < k {18 if i == n {19 res = append(res, b[j:min(j+k-len(res), m)]...)20 break21 }22 if j == m {23 res = append(res, a[i:min(i+k-len(res), n)]...)24 break25 }26 if a[i] < b[j] {27 res = append(res, a[i])28 i++29 } else {30 res = append(res, b[j])31 j++32 }33 }34 return res35}36 37func (t seg65) build(a []int, o, l, r int) {38 if l == r {39 t[o] = a[l-1 : l]40 return41 }42 m := (l + r) >> 143 t.build(a, o<<1, l, m)44 t.build(a, o<<1|1, m+1, r)45 t[o] = t.merge(t[o<<1], t[o<<1|1])46}47 48func (t seg65) query(o, l, r, L, R int) []int {49 if L <= l && r <= R {50 return t[o]51 }52 m := (l + r) >> 153 if R <= m {54 return t.query(o<<1, l, m, L, R)55 }56 if m < L {57 return t.query(o<<1|1, m+1, r, L, R)58 }59 return t.merge(t.query(o<<1, l, m, L, R), t.query(o<<1|1, m+1, r, L, R))60}61 62func CF1665E(_r io.Reader, _w io.Writer) {63 in := bufio.NewReader(_r)64 out := bufio.NewWriter(_w)65 defer out.Flush()66 67 var T, n, q, l, r int68 for Fscan(in, &T); T > 0; T-- {69 Fscan(in, &n)70 a := make([]int, n)71 for i := range a {72 Fscan(in, &a[i])73 }74 t := make(seg65, n*4)75 t.build(a, 1, 1, n)76 for Fscan(in, &q); q > 0; q-- {77 Fscan(in, &l, &r)78 b := t.query(1, 1, n, l, r)79 ans := 1 << 3080 for i, v := range b {81 for _, w := range b[:i] {82 ans = min(ans, v|w)83 }84 }85 Fprintln(out, ans)86 }87 }88}89 9091