Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "math/bits"8)9 1011type seg24 []struct{ l, r, min int }12 13func (t seg24) build(o, l, r int) {14 t[o].l, t[o].r = l, r15 if l == r {16 return17 }18 m := (l + r) >> 119 t.build(o<<1, l, m)20 t.build(o<<1|1, m+1, r)21}22 23func (t seg24) update(o, i, v int) {24 cur := &t[o]25 if cur.l == cur.r {26 cur.min = v27 return28 }29 m := (cur.l + cur.r) >> 130 if i <= m {31 t.update(o<<1, i, v)32 } else {33 t.update(o<<1|1, i, v)34 }35 t[o].min = min(t[o<<1].min, t[o<<1|1].min)36}37 38func (t seg24) query(o, l, r int) int {39 if l <= t[o].l && t[o].r <= r {40 return t[o].min41 }42 m := (t[o].l + t[o].r) >> 143 if r <= m {44 return t.query(o<<1, l, r)45 }46 if m < l {47 return t.query(o<<1|1, l, r)48 }49 return min(t.query(o<<1, l, r), t.query(o<<1|1, l, r))50}51 52func cf524E(in io.Reader, _w io.Writer) {53 out := bufio.NewWriter(_w)54 defer out.Flush()55 var n, m, k, q int56 Fscan(in, &n, &m, &k, &q)57 a := make([]struct{ x, y int }, k)58 for i := range a {59 Fscan(in, &a[i].x, &a[i].y)60 }61 qs := make([]struct{ x1, y1, x2, y2 int }, q)62 for i := range qs {63 Fscan(in, &qs[i].x1, &qs[i].y1, &qs[i].x2, &qs[i].y2)64 }65 66 ans := make([]bool, q)67 f := func() {68 xs := make([][]int, m+1)69 for _, p := range a {70 xs[p.y] = append(xs[p.y], p.x)71 }72 g := make([][]int, m+1)73 for i, q := range qs {74 g[q.y2] = append(g[q.y2], i)75 }76 77 t := make(seg24, 2<<bits.Len(uint(n-1)))78 t.build(1, 1, n)79 80 for y, xs := range xs {81 for _, x := range xs {82 t.update(1, x, y)83 }84 for _, i := range g[y] {85 q := qs[i]86 if t.query(1, q.x1, q.x2) >= q.y1 {87 ans[i] = true88 }89 }90 }91 }92 f()93 n, m = m, n94 for i := range a {95 a[i].x, a[i].y = a[i].y, a[i].x96 }97 for i := range qs {98 q := &qs[i]99 q.x1, q.y1 = q.y1, q.x1100 q.x2, q.y2 = q.y2, q.x2101 }102 f()103 104 for _, b := range ans {105 if b {106 Fprintln(out, "YES")107 } else {108 Fprintln(out, "NO")109 }110 }111}112 113114