66#include " ../../library/data_structures/uncommon/linear_rmq.hpp"
77tuple<int , vector<vector<int >>, vector<int >>
88min_cartesian_tree (const vector<int >& a,
9- const vector<int >& l, const vector<int >& r) {
9+ const vector<int >& l, const vector<int >& r) {
1010 int n = sz (a);
1111 assert (sz (l) == n && sz (r) == n);
1212 auto is_node = [&](int i) -> bool {
@@ -24,7 +24,7 @@ min_cartesian_tree(const vector<int>& a,
2424 root = i;
2525 } else if (is_node (i)) {
2626 bool le_par =
27- (l[i] >= 0 && (r[i] == n || a[l[i]] > a[r[i]]));
27+ (l[i] >= 0 && (r[i] == n || a[l[i]] > a[r[i]]));
2828 adj[to_min[le_par ? l[i] : r[i]]].push_back (i);
2929 }
3030 }
@@ -40,42 +40,17 @@ void mono_st_asserts(const vector<int>& a) {
4040 for (auto cmp : compares) {
4141 vector<int > init (n);
4242 iota (begin (init), end (init), 0 );
43- RMQ rmq (init, [&](int x, int y) -> int {
44- return cmp (a[x], a[y]) ? x : y;
45- });
4643 linear_rmq lin_rmq (a, cmp);
4744 auto l = mono_st (a, cmp), r = mono_range (l),
4845 p = cart_binary_tree (l);
49- {
50- int iterations = 0 ;
51- queue<array<int , 3 >> q;
52- q.push ({0 , n, -1 }); // node_le, node_ri, parent
53- while (!empty (q)) {
54- auto [node_le, node_ri, node_par] = q.front ();
55- q.pop ();
56- if (node_le == node_ri) continue ;
57- iterations++;
58- int idx_root = rmq.query (node_le, node_ri);
59- int idx_root_2 =
60- lin_rmq.query_idx (node_le, node_ri - 1 );
61- assert (idx_root == idx_root_2);
62- assert (node_le <= idx_root && idx_root < node_ri);
63- assert (l[idx_root] == node_le - 1 );
64- assert (r[idx_root] == node_ri);
65- assert (p[idx_root] == node_par);
66- q.push ({node_le, idx_root, idx_root});
67- q.push ({idx_root + 1 , node_ri, idx_root});
68- }
69- assert (iterations == n);
70- }
7146 {
7247 vector old_way_ri =
73- mono_st<int >({rbegin (a), rend (a)},
74- [&](int x, int y) { return !cmp (y, x); });
48+ mono_st<int >({rbegin (a), rend (a)},
49+ [&](int x, int y) { return !cmp (y, x); });
7550 reverse (begin (old_way_ri), end (old_way_ri));
7651 transform (begin (old_way_ri), end (old_way_ri),
77- begin (old_way_ri),
78- [&](int i) { return sz (a) - i - 1 ; });
52+ begin (old_way_ri),
53+ [&](int i) { return sz (a) - i - 1 ; });
7954 assert (r == old_way_ri);
8055 }
8156 int iterations = 0 ;
0 commit comments