Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 9func min87(a, b int) int {10 if a < b {11 return a12 }13 return b14}15 16type node87 struct{ l, r, v int }17type seg87 []node8718 19func (t seg87) maintain(o int) { t[o].v = min87(t[o<<1].v, t[o<<1|1].v) }20func (t seg87) build(o, l, r int) {21 t[o] = node87{l, r, 1e9}22 if l == r {23 return24 }25 m := (l + r) >> 126 t.build(o<<1, l, m)27 t.build(o<<1|1, m+1, r)28}29func (t seg87) update(o, i, v int) {30 if t[o].l == t[o].r {31 t[o].v = v32 return33 }34 if i <= (t[o].l+t[o].r)>>1 {35 t.update(o<<1, i, v)36 } else {37 t.update(o<<1|1, i, v)38 }39 t.maintain(o)40}41func (t seg87) query(o, l, r int) int {42 if l <= t[o].l && t[o].r <= r {43 return t[o].v44 }45 m := (t[o].l + t[o].r) >> 146 if r <= m {47 return t.query(o<<1, l, r)48 }49 if l > m {50 return t.query(o<<1|1, l, r)51 }52 return min87(t.query(o<<1, l, r), t.query(o<<1|1, l, r))53}54 5556func CF1187D(_r io.Reader, _w io.Writer) {57 in := bufio.NewReader(_r)58 out := bufio.NewWriter(_w)59 defer out.Flush()60 61 var T, n, v int62o:63 for Fscan(in, &T); T > 0; T-- {64 Fscan(in, &n)65 t := make(seg87, 4*n)66 t.build(1, 1, n)67 pos := make([][]int, n+1)68 for i := 1; i <= n; i++ {69 Fscan(in, &v)70 if pos[v] == nil {71 t.update(1, v, i)72 }73 pos[v] = append(pos[v], i)74 }75 for ; n > 0; n-- {76 Fscan(in, &v)77 if len(pos[v]) == 0 || t.query(1, 1, v) < pos[v][0] {78 for n--; n > 0; n-- {79 Fscan(in, &v)80 }81 Fprintln(out, "NO")82 continue o83 }84 pos[v] = pos[v][1:]85 p := int(1e9)86 if len(pos[v]) > 0 {87 p = pos[v][0]88 }89 t.update(1, v, p)90 }91 Fprintln(out, "YES")92 }93}94 9596