Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 "cmp"6 . "fmt"7 "io"8)9 1011type nodeMS00[K comparable] struct {12 son [2]*nodeMS00[K]13 priority uint14 key K15 keyCnt int16 subSize int17}18 19func (o *nodeMS00[K]) size() int {20 if o != nil {21 return o.subSize22 }23 return 024}25 26func (o *nodeMS00[K]) maintain() {27 o.subSize = o.keyCnt + o.son[0].size() + o.son[1].size()28}29 30func (o *nodeMS00[K]) rotate(d int) *nodeMS00[K] {31 x := o.son[d^1]32 o.son[d^1] = x.son[d]33 x.son[d] = o34 o.maintain()35 x.maintain()36 return x37}38 39type treapMS00[K comparable] struct {40 rd uint41 root *nodeMS00[K]42 comparator func(a, b K) int43}44 45func (t *treapMS00[K]) fastRand() uint {46 t.rd ^= t.rd << 1347 t.rd ^= t.rd >> 1748 t.rd ^= t.rd << 549 return t.rd50}51 52func (t *treapMS00[K]) empty() bool { return t.root.size() == 0 }53 54func (t *treapMS00[K]) _put(o *nodeMS00[K], key K) *nodeMS00[K] {55 if o == nil {56 o = &nodeMS00[K]{priority: t.fastRand(), key: key, keyCnt: 1}57 } else {58 c := t.comparator(key, o.key)59 if c == 0 {60 o.keyCnt++61 } else {62 d := 063 if c > 0 {64 d = 165 }66 o.son[d] = t._put(o.son[d], key)67 if o.son[d].priority > o.priority {68 o = o.rotate(d ^ 1)69 }70 }71 }72 o.maintain()73 return o74}75 76func (t *treapMS00[K]) put(key K) { t.root = t._put(t.root, key) }77 78func (t *treapMS00[K]) _delete(o *nodeMS00[K], key K) *nodeMS00[K] {79 if o == nil {80 return nil81 }82 if c := t.comparator(key, o.key); c != 0 {83 d := 084 if c > 0 {85 d = 186 }87 o.son[d] = t._delete(o.son[d], key)88 } else {89 if o.keyCnt > 1 {90 o.keyCnt--91 } else {92 if o.son[1] == nil {93 return o.son[0]94 }95 if o.son[0] == nil {96 return o.son[1]97 }98 d := 099 if o.son[0].priority > o.son[1].priority {100 d = 1101 }102 o = o.rotate(d)103 o.son[d] = t._delete(o.son[d], key)104 }105 }106 o.maintain()107 return o108}109 110func (t *treapMS00[K]) delete(key K) { t.root = t._delete(t.root, key) }111 112func (t *treapMS00[K]) min() *nodeMS00[K] { return t.kth(0) }113 114func (t *treapMS00[K]) lowerBoundIndex(key K) (kth int) {115 for o := t.root; o != nil; {116 c := t.comparator(key, o.key)117 if c < 0 {118 o = o.son[0]119 } else if c > 0 {120 kth += o.son[0].size() + o.keyCnt121 o = o.son[1]122 } else {123 kth += o.son[0].size()124 break125 }126 }127 return128}129 130func (t *treapMS00[K]) kth(k int) (o *nodeMS00[K]) {131 if k < 0 || k >= t.root.size() {132 return133 }134 for o = t.root; o != nil; {135 leftSize := o.son[0].size()136 if k < leftSize {137 o = o.son[0]138 } else {139 k -= leftSize + o.keyCnt140 if k < 0 {141 break142 }143 o = o.son[1]144 }145 }146 return147}148 149func newMultiset00[K cmp.Ordered]() *treapMS00[K] {150 return &treapMS00[K]{151 rd: 1,152 comparator: cmp.Compare[K],153 }154}155 156const stNodeDefaultVal00 = 1e9157 158var emptyStNode00 = &stNode00{val: stNodeDefaultVal00}159 160func init() {161 emptyStNode00.lo = emptyStNode00162 emptyStNode00.ro = emptyStNode00163}164 165type stNode00 struct {166 lo, ro *stNode00167 l, r, val int168}169 170func (o *stNode00) update(i int, val int) {171 if o.l == o.r {172 o.val = val173 return174 }175 m := (o.l + o.r) >> 1176 if i <= m {177 if o.lo == emptyStNode00 {178 o.lo = &stNode00{lo: emptyStNode00, ro: emptyStNode00, l: o.l, r: m, val: stNodeDefaultVal00}179 }180 o.lo.update(i, val)181 } else {182 if o.ro == emptyStNode00 {183 o.ro = &stNode00{lo: emptyStNode00, ro: emptyStNode00, l: m + 1, r: o.r, val: stNodeDefaultVal00}184 }185 o.ro.update(i, val)186 }187 o.val = min(o.lo.val, o.ro.val)188}189 190func (o *stNode00) query(l int) int {191 if o == emptyStNode00 || l > o.r {192 return stNodeDefaultVal00193 }194 if l <= o.l {195 return o.val196 }197 return min(o.lo.query(l), o.ro.query(l))198}199 200func newStRoot00(l, r int) *stNode00 {201 return &stNode00{lo: emptyStNode00, ro: emptyStNode00, l: l, r: r, val: stNodeDefaultVal00}202}203 204func cf2000H(in io.Reader, _w io.Writer) {205 out := bufio.NewWriter(_w)206 defer out.Flush()207 const mx = 4e6 + 1208 var T, n, v, m int209 var op string210 for Fscan(in, &T); T > 0; T-- {211 t := newStRoot00(1, mx)212 gap := map[int]*treapMS00[int]{}213 put := func(l, r int) {214 k := r - l - 1215 if k == 0 {216 return217 }218 if gap[k] == nil {219 gap[k] = newMultiset00[int]()220 }221 gap[k].put(l + 1)222 t.update(k, gap[k].min().key)223 }224 del := func(l, r int) {225 k := r - l - 1226 if k == 0 {227 return228 }229 t2 := gap[k]230 t2.delete(l + 1)231 if t2.empty() {232 t.update(k, 1e9)233 } else {234 t.update(k, t2.min().key)235 }236 }237 238 set := newMultiset00[int]()239 set.put(0)240 pre := 0241 for Fscan(in, &n); n > 0; n-- {242 Fscan(in, &v)243 set.put(v)244 put(pre, v)245 pre = v246 }247 set.put(mx)248 put(pre, mx)249 250 for Fscan(in, &m); m > 0; m-- {251 Fscan(in, &op, &v)252 if op == "+" {253 i := set.lowerBoundIndex(v)254 l, r := set.kth(i-1).key, set.kth(i).key255 set.put(v)256 del(l, r)257 put(l, v)258 put(v, r)259 } else if op == "-" {260 i := set.lowerBoundIndex(v)261 l, r := set.kth(i-1).key, set.kth(i+1).key262 set.delete(v)263 del(l, v)264 del(v, r)265 put(l, r)266 } else {267 Fprint(out, t.query(v), " ")268 }269 }270 Fprintln(out)271 }272}273 274275