54template <Mono
id T, Lazy<T> L,
bool store_reverse = false>
struct SplayTree {
56 using splaytree = SplayTree<T, L, store_reverse>;
60 int size(node *v) {
return !v ? 0 : v->
sz; }
61 void update(node *v) {
64 if constexpr (store_reverse) {
70 if constexpr (store_reverse) {
71 v->rev_sum = v->rev_sum.merge(v->
l->rev_sum);
77 if constexpr (store_reverse) {
78 v->rev_sum = v->
r->rev_sum.merge(v->rev_sum);
82 void push_down(node *v) {
87 propagate(v->
l, v->
lz);
90 propagate(v->
r, v->
lz);
103 void propagate(node *v, L x) {
104 v->
lz = x.merge(v->
lz);
105 v->
val = x.apply(v->
val, 1);
107 if constexpr (store_reverse) {
108 v->rev_sum = x.apply(v->rev_sum, v->
sz);
111 void reverse(node *v) {
113 if constexpr (store_reverse) {
114 swap(v->
sum, v->rev_sum);
118 node *rotate_right(node *v) {
126 node *rotate_left(node *v) {
134 node *splay_top_down(node *v,
int k) {
136 int szl = v->
l ? v->
l->
sz : 0;
145 }
else if (k < szll) {
146 v->
l->
l = splay_top_down(v->
l->
l, k);
150 v->
l->
r = splay_top_down(v->
l->
r, k - szll - 1);
151 v->
l = rotate_left(v->
l);
160 }
else if (k < szrl) {
161 v->
r->
l = splay_top_down(v->
r->
l, k);
162 v->
r = rotate_right(v->
r);
165 v->
r->
r = splay_top_down(v->
r->
r, k - szrl - 1);
173 node *merge_inner(node *l, node *r) {
177 r = splay_top_down(r, 0);
182 pair<node *, node *> split_inner(node *v,
int k) {
187 v = splay_top_down(v, k);
193 tuple<node *, node *, node *> split3_inner(node *v,
int l,
int r) {
195 auto [b, c] = split_inner(v, r);
196 return {
nullptr, b, c};
198 v = splay_top_down(v, l - 1);
199 auto [b, c] = split_inner(v->
r, r - l);
206 node *inv_split3_inner(node *a, node *b, node *c) {
207 node *v = merge_inner(b, c);
215 node *merge3_inner(node *a, node *b, node *c) {
216 node *v = merge_inner(b, c);
217 return merge_inner(a, v);
219 node *set_inner(node *v,
int k, T x) {
220 v = splay_top_down(v, k);
225 node *get_inner(node *v,
int k, T &x) {
226 v = splay_top_down(v, k);
230 node *update_inner(node *v,
int l,
int r, L x) {
234 auto [a, b, c] = split3_inner(v, l, r);
236 return inv_split3_inner(a, b, c);
238 node *query_inner(node *v,
int l,
int r, T &res) {
242 auto [a, b, c] = split3_inner(v, l, r);
244 return inv_split3_inner(a, b, c);
246 template <
typename P>
247 node *max_right_inner(node *v,
int l, P pred,
int &res) {
252 v = splay_top_down(v, l);
258 v->
r = max_right_inner(v->
r, v->
val, pred, res);
265 template <
typename P>
266 node *max_right_inner(node *v, T sum, P pred,
int &res) {
273 lsum = lsum.merge(v->
l->
sum);
275 lsum = lsum.merge(v->
val);
277 int szl = v->
l ? v->
l->
sz : 0;
279 v->
r = max_right_inner(v->
r, lsum, pred, res);
284 v->
l = max_right_inner(v->
l, sum, pred, res);
292 template <
typename P> node *min_left_inner(node *v,
int r, P pred,
int &res) {
297 v = splay_top_down(v, r - 1);
303 v->
l = min_left_inner(v->
l, v->
val, pred, res);
310 template <
typename P> node *min_left_inner(node *v, T sum, P pred,
int &res) {
317 rsum = v->
r->
sum.merge(rsum);
319 rsum = v->
val.merge(rsum);
321 int szr = v->
r ? v->
r->
sz : 0;
323 v->
l = min_left_inner(v->
l, rsum, pred, res);
328 v->
r = min_left_inner(v->
r, sum, pred, res);
336 node *reverse_inner(node *v,
int l,
int r) {
340 auto [a, b, c] = split3_inner(v, l, r);
344 return inv_split3_inner(a, b, c);
346 node *insert_inner(node *v,
int k, node *u) {
357 v = splay_top_down(v, k);
364 node *erase_inner(node *v,
int k) {
365 v = splay_top_down(v, k);
366 return merge_inner(v->
l, v->
r);
368 node *build(
const vector<T> &v,
int l,
int r) {
369 int m = (l + r) >> 1;
370 node *u =
new node(v[m]);
372 u->
l = build(v, l, m);
375 u->
r = build(v, m + 1, r);
393 explicit SplayTree(
int n) : SplayTree(vector<T>(n, T::id())) {}
399 explicit SplayTree(
const vector<T> &v) : root(nullptr) {
401 root = build(v, 0, v.size());
420 assert(0 <= k && k <
size());
421 root = set_inner(root, k, x);
432 assert(0 <= k && k <
size());
434 root = get_inner(root, k, res);
447 assert(0 <= l && l <= r && r <=
size());
448 root = update_inner(root, l, r, x);
460 assert(0 <= l && l <= r && r <=
size());
462 root = query_inner(root, l, r, res);
483 assert(0 <= l && l <=
size());
485 root = max_right_inner(root, l, pred, res);
492 return max_right(l, [](T x) {
return pred(x); });
510 template <
typename P>
int min_left(
int r, P pred) {
511 assert(0 <= r && r <=
size());
513 root = min_left_inner(root, r, pred, res);
520 return min_left(r, [](T x) {
return pred(x); });
532 assert(0 <= l && l <= r && r <=
size());
533 root = reverse_inner(root, l, r);
547 assert(0 <= k && k <=
size());
548 root = insert_inner(root, k,
new node(x));
558 assert(0 <= k && k <
size());
559 root = erase_inner(root, k);
570 assert(0 <= k && k <=
size());
571 auto [a, b] = split_inner(root, k);
588 pair<splaytree, splaytree>
split(
int l,
int r) {
589 assert(0 <= l && l <= r && r <=
size());
590 auto [a, b, c] = split3_inner(root, l, r);
592 return {splaytree(b), splaytree(c)};
603 root = merge_inner(root, o.root);
615 void merge(splaytree &b, splaytree &c) {
616 root = merge3_inner(root, b.root, c.root);
617 b.root = c.root =
nullptr;