Use this to learn the idea, then write your own version.
1package main2 3import (4 . "fmt"5 "io"6 "slices"7 "sort"8)9 1011type node80 struct {12 lo, ro *node8013 minL int14}15 16func build80(l, r int) *node80 {17 o := &node80{}18 if l == r {19 return o20 }21 m := (l + r) >> 122 o.lo = build80(l, m)23 o.ro = build80(m+1, r)24 return o25}26 27func (o node80) update(l, r, i, val int) *node80 {28 if l == r {29 o.minL = max(o.minL, val)30 return &o31 }32 m := (l + r) >> 133 if i <= m {34 o.lo = o.lo.update(l, m, i, val)35 } else {36 o.ro = o.ro.update(m+1, r, i, val)37 }38 o.minL = min(o.lo.minL, o.ro.minL)39 return &o40}41 42func (o *node80) query(l, r, ql, qr int) int {43 if ql <= l && r <= qr {44 return o.minL45 }46 m := (l + r) >> 147 if qr <= m {48 return o.lo.query(l, m, ql, qr)49 }50 if m < ql {51 return o.ro.query(m+1, r, ql, qr)52 }53 return min(o.lo.query(l, m, ql, qr), o.ro.query(m+1, r, ql, qr))54}55 56func cf1080F(in io.Reader, out io.Writer) {57 var n, m, k, l, r, p, mn, mx int58 Fscan(in, &n, &m, &k)59 type pair struct{ l, p int }60 g := map[int][]pair{}61 for range k {62 Fscan(in, &l, &r, &p)63 g[r] = append(g[r], pair{l, p})64 }65 66 rs := make([]int, 0, len(g))67 for r := range g {68 rs = append(rs, r)69 }70 slices.Sort(rs)71 72 t := make([]*node80, len(rs)+1)73 t[0] = build80(1, n)74 for i, r := range rs {75 rt := t[i]76 for _, p := range g[r] {77 rt = rt.update(1, n, p.p, p.l)78 }79 t[i+1] = rt80 }81 82 for range m {83 Fscan(in, &l, &r, &mn, &mx)84 i := sort.SearchInts(rs, mx+1)85 if t[i].query(1, n, l, r) >= mn {86 Fprintln(out, "yes")87 } else {88 Fprintln(out, "no")89 }90 }91}92 9394