Skip to content

Commit 772aa5c

Browse files
committed
update interface of ST walk to be more useful
1 parent eeb718c commit 772aa5c

4 files changed

Lines changed: 46 additions & 26 deletions

File tree

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
int max_right(int l, int r, const auto& f) {
2-
if (T x = s[l + n]; f(x))
1+
void max_right(int l, int r, const auto& f) {
2+
if (T x = s[l + n]; f(x, l))
33
for (l++; l <= r;) {
4-
int u = l + n, v = __lg(min(u & -u, r - l + 1));
5-
if (T y = op(x, s[u >> v]); f(y)) l += 1 << v, x = y;
6-
else r = l + (1 << v) - 2;
4+
int u = l + n, v = __lg(min(u & -u, r - l + 1)),
5+
m = l + (1 << v) - 1;
6+
if (T y = op(x, s[u >> v]); f(y, m))
7+
l = m + 1, x = y;
8+
else r = m - 1;
79
}
8-
return l;
910
}
Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
int min_left(int l, int r, const auto& f) {
2-
if (T x = s[r + n]; f(x))
2+
if (T x = s[r + n]; f(x, r))
33
for (r--; l <= r;) {
4-
int u = r + 1 + n, v = __lg(min(u & -u, r - l + 1));
5-
if (T y = op(s[(u - 1) >> v], x); f(y))
6-
r -= 1 << v, x = y;
7-
else l = r - (1 << v) + 2;
4+
int u = r + 1 + n, v = __lg(min(u & -u, r - l + 1)),
5+
m = r - (1 << v) + 1;
6+
if (T y = op(s[(u - 1) >> v], x); f(y, m))
7+
r = m - 1, x = y;
8+
else l = m + 1;
89
}
910
return r;
1011
}

tests/library_checker_aizu_tests/data_structures/simple_tree_inc_line.test.cpp

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,39 +30,51 @@ int main() {
3030
array<int, 2> res = st.query(l, r);
3131
{
3232
array<int, 2> walk_res = {1, 0};
33-
int idx = st.max_right(l, r,
34-
[&](const array<int, 2>& curr_line) -> bool {
33+
int idx = -1;
34+
st.max_right(l, r,
35+
[&](const array<int, 2>& curr_line,
36+
int m) -> bool {
37+
idx = m;
3538
walk_res = curr_line;
3639
return 1;
3740
});
3841
assert(res == walk_res);
39-
assert(idx == r + 1);
42+
assert(idx == r);
4043
}
4144
{
4245
array<int, 2> walk_res = unit;
43-
int idx = st.max_right(l, r,
44-
[&](const array<int, 2>& curr_line) -> bool {
46+
int idx = -1;
47+
st.max_right(l, r,
48+
[&](const array<int, 2>& curr_line,
49+
int m) -> bool {
4550
walk_res = curr_line;
51+
idx = m;
4652
return 0;
4753
});
4854
assert(walk_res == st.query(l, l));
4955
assert(idx == l);
5056
}
5157
{
5258
array<int, 2> walk_res = unit;
53-
int idx = st.min_left(l, r,
54-
[&](const array<int, 2>& curr_line) -> bool {
59+
int idx = -1;
60+
st.min_left(l, r,
61+
[&](const array<int, 2>& curr_line,
62+
int m) -> bool {
5563
walk_res = curr_line;
64+
idx = m;
5665
return 1;
5766
});
5867
assert(walk_res == res);
59-
assert(idx == l - 1);
68+
assert(idx == l);
6069
}
6170
{
6271
array<int, 2> walk_res = unit;
63-
int idx = st.min_left(l, r,
64-
[&](const array<int, 2>& curr_line) -> bool {
72+
int idx = -1;
73+
st.min_left(l, r,
74+
[&](const array<int, 2>& curr_line,
75+
int m) -> bool {
6576
walk_res = curr_line;
77+
idx = m;
6678
return 0;
6779
});
6880
assert(walk_res == st.query(r, r));

tests/library_checker_aizu_tests/data_structures/simple_tree_inc_walk.test.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,20 @@ int main() {
2222
cout << st.query(k, k) << '\n';
2323
} else if (type == 3) {
2424
// returns first element in [k,n-1] such that mx > 0
25-
int idx = st.max_right(k, n - 1,
26-
[&](int mx) { return mx == 0; });
27-
if (idx == n) idx = -1;
25+
int idx = -1;
26+
st.max_right(k, n - 1, [&](int mx, int m) {
27+
if (mx == 0) return 1;
28+
idx = m;
29+
return 0;
30+
});
2831
cout << idx << '\n';
2932
} else {
3033
assert(type == 4);
31-
cout << st.min_left(0, k, [&](int mx) {
32-
return mx == 0;
34+
int idx = -1;
35+
cout << st.min_left(0, k, [&](int mx, int m) {
36+
if (mx == 0) return 1;
37+
idx = m;
38+
return 0;
3339
}) << '\n';
3440
}
3541
}

0 commit comments

Comments
 (0)