Use this to learn the idea, then write your own version.
1package main2 3import (4 "cmp"5 . "fmt"6 "io"7 "math/bits"8 "time"9)10 1112type nodeM72[K comparable, V any] struct {13 son [2]*nodeM72[K, V]14 priority uint15 key K16 value V17 subSize int18}19 20func (o *nodeM72[K, V]) size() int {21 if o != nil {22 return o.subSize23 }24 return 025}26 27func (o *nodeM72[K, V]) maintain() {28 o.subSize = 1 + o.son[0].size() + o.son[1].size()29}30 31func (o *nodeM72[K, V]) rotate(d int) *nodeM72[K, V] {32 x := o.son[d^1]33 o.son[d^1] = x.son[d]34 x.son[d] = o35 o.maintain()36 x.maintain()37 return x38}39 40type treapM72[K comparable, V any] struct {41 rd uint42 root *nodeM72[K, V]43 comparator func(a, b K) int44}45 46func (t *treapM72[K, V]) fastRand() uint {47 t.rd ^= t.rd << 1348 t.rd ^= t.rd >> 1749 t.rd ^= t.rd << 550 return t.rd51}52 53func (t *treapM72[K, V]) size() int { return t.root.size() }54func (t *treapM72[K, V]) empty() bool { return t.size() == 0 }55 56func (t *treapM72[K, V]) _put(o *nodeM72[K, V], key K, value V) *nodeM72[K, V] {57 if o == nil {58 o = &nodeM72[K, V]{priority: t.fastRand(), key: key, value: value}59 } else {60 c := t.comparator(key, o.key)61 if c == 0 {62 o.value = value63 } else {64 d := 065 if c > 0 {66 d = 167 }68 o.son[d] = t._put(o.son[d], key, value)69 if o.son[d].priority > o.priority {70 o = o.rotate(d ^ 1)71 }72 }73 }74 o.maintain()75 return o76}77 78func (t *treapM72[K, V]) put(key K, value V) { t.root = t._put(t.root, key, value) }79 80func (t *treapM72[K, V]) _delete(o *nodeM72[K, V], key K) *nodeM72[K, V] {81 if o == nil {82 return nil83 }84 if c := t.comparator(key, o.key); c != 0 {85 d := 086 if c > 0 {87 d = 188 }89 o.son[d] = t._delete(o.son[d], key)90 } else {91 if o.son[1] == nil {92 return o.son[0]93 }94 if o.son[0] == nil {95 return o.son[1]96 }97 d := 098 if o.son[0].priority > o.son[1].priority {99 d = 1100 }101 o = o.rotate(d)102 o.son[d] = t._delete(o.son[d], key)103 }104 o.maintain()105 return o106}107 108func (t *treapM72[K, V]) delete(key K) { t.root = t._delete(t.root, key) }109 110func (t *treapM72[K, V]) min() *nodeM72[K, V] { return t.kth(0) }111func (t *treapM72[K, V]) max() *nodeM72[K, V] { return t.kth(t.size() - 1) }112 113func (t *treapM72[K, V]) lowerBoundIndex(key K) (kth int) {114 for o := t.root; o != nil; {115 c := t.comparator(key, o.key)116 if c < 0 {117 o = o.son[0]118 } else if c > 0 {119 kth += o.son[0].size() + 1120 o = o.son[1]121 } else { 122 kth += o.son[0].size()123 break124 }125 }126 return127}128 129func (t *treapM72[K, V]) upperBoundIndex(key K) (kth int) {130 for o := t.root; o != nil; {131 c := t.comparator(key, o.key)132 if c < 0 {133 o = o.son[0]134 } else if c > 0 {135 kth += o.son[0].size() + 1136 o = o.son[1]137 } else {138 kth += o.son[0].size() + 1139 break140 }141 }142 return143}144 145func (t *treapM72[K, V]) kth(k int) (o *nodeM72[K, V]) {146 if k < 0 || k >= t.root.size() {147 return148 }149 for o = t.root; o != nil; {150 leftSize := o.son[0].size()151 if k < leftSize {152 o = o.son[0]153 } else {154 k -= leftSize + 1155 if k < 0 {156 break157 }158 o = o.son[1]159 }160 }161 return162}163 164func (t *treapM72[K, V]) prev(key K) *nodeM72[K, V] { return t.kth(t.lowerBoundIndex(key) - 1) }165func (t *treapM72[K, V]) next(key K) *nodeM72[K, V] { return t.kth(t.upperBoundIndex(key)) }166 167func (t *treapM72[K, V]) find(key K) *nodeM72[K, V] {168 o := t.kth(t.lowerBoundIndex(key))169 if o == nil || o.key != key {170 return nil171 }172 return o173}174 175func newMap72[K cmp.Ordered, V any]() *treapM72[K, V] {176 return &treapM72[K, V]{177 rd: uint(time.Now().UnixNano())/2 + 1,178 comparator: cmp.Compare[K],179 }180}181 182func cf372D(in io.Reader, out io.Writer) {183 var n, k, dfn int184 Fscan(in, &n, &k)185 g := make([][]int, n)186 for range n - 1 {187 var v, w int188 Fscan(in, &v, &w)189 v--190 w--191 g[v] = append(g[v], w)192 g[w] = append(g[w], v)193 }194 195 const mx = 17196 pa := make([][mx]int, n)197 dep := make([]int, n)198 vToDFN := make([]int, n)199 var build func(int, int)200 build = func(v, p int) {201 vToDFN[v] = dfn202 dfn++203 pa[v][0] = p204 for _, w := range g[v] {205 if w != p {206 dep[w] = dep[v] + 1207 build(w, v)208 }209 }210 }211 build(0, -1)212 for i := range mx - 1 {213 for v := range pa {214 if p := pa[v][i]; p != -1 {215 pa[v][i+1] = pa[p][i]216 } else {217 pa[v][i+1] = -1218 }219 }220 }221 uptoDep := func(v, d int) int {222 for k := uint(dep[v] - d); k > 0; k &= k - 1 {223 v = pa[v][bits.TrailingZeros(k)]224 }225 return v226 }227 getLCA := func(v, w int) int {228 if dep[v] > dep[w] {229 v, w = w, v230 }231 w = uptoDep(w, dep[v])232 if w == v {233 return v234 }235 for i := mx - 1; i >= 0; i-- {236 if pv, pw := pa[v][i], pa[w][i]; pv != pw {237 v, w = pv, pw238 }239 }240 return pa[v][0]241 }242 getDis := func(v, w int) int { return dep[v] + dep[w] - dep[getLCA(v, w)]*2 }243 244 t := newMap72[int, int]()245 getInc := func(v, dfnV int) int {246 o := t.prev(dfnV)247 if o == nil {248 o = t.max()249 }250 p := o.value251 o = t.next(dfnV)252 if o == nil {253 o = t.min()254 }255 q := o.value256 return getDis(p, v) + getDis(v, q) - getDis(p, q)257 }258 259 var ans, s, l int260 for r, dfnR := range vToDFN {261 t.put(dfnR, r)262 s += getInc(r, dfnR)263 for s > k*2-2 {264 dfnL := vToDFN[l]265 s -= getInc(l, dfnL)266 t.delete(dfnL)267 l++268 }269 ans = max(ans, r-l+1)270 }271 Fprint(out, ans)272}273 274275