Skip to content

Commit f20db68

Browse files
committed
now inc-exc changes
1 parent 334ac80 commit f20db68

File tree

5 files changed

+50
-35
lines changed

5 files changed

+50
-35
lines changed

library/data_structures_[l,r)/seg_tree.hpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,14 @@
66
//! return vl + vr;
77
//! });
88
//! tree st(n, INT_MAX, ranges::min);
9-
//! int idx = st.max_right(l, r, [&](int value) {
9+
//! int idx = st.max_right(l, r, [&](int m, int value) {
10+
//! // value = op(a[l], a[l+1], ..., a[m-1])
1011
//! return value <= x;
1112
//! });
12-
//! // idx in [l, r]
13-
//! // f(op(a[l], a[l+1], ..., a[idx-1])) is true
14-
//! // f(op(a[l], a[l+1], ..., a[idx])) is false
15-
//! idx = st.min_left(l, r, [&](int value) {
13+
//! idx = st.min_left(l, r, [&](int m, int value) {
14+
//! // value = op(a[m], ..., a[r-2], a[r-1])
1615
//! return value <= x;
1716
//! });
18-
//! // idx in [l, r]
19-
//! // f(op(a[idx], ..., a[r-2], a[r-1])) is true
20-
//! // f(op(a[idx-1], ..., a[r-2], a[r-1])) is false
2117
//! @endcode
2218
//! @time O(n + q log n)
2319
//! @space O(n)
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
int max_right(int l, int r, const auto& f) {
1+
void max_right(int l, int r, const auto& f) {
22
for (T x = unit; l < r;) {
3-
int u = l + n, v = __lg(min(u & -u, r - l));
4-
if (T y = op(x, s[u >> v]); f(y)) l += 1 << v, x = y;
5-
else r = l + (1 << v) - 1;
3+
int u = l + n, v = __lg(min(u & -u, r - l)),
4+
m = l + (1 << v);
5+
if (T y = op(x, s[u >> v]); f(m, y)) l = m, x = y;
6+
else r = m - 1;
67
}
7-
return l;
88
}
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
int min_left(int l, int r, const auto& f) {
1+
void min_left(int l, int r, const auto& f) {
22
for (T x = unit; l < r;) {
3-
int u = r + n, v = __lg(min(u & -u, r - l));
4-
if (T y = op(s[(u - 1) >> v], x); f(y))
5-
r -= 1 << v, x = y;
6-
else l = r - (1 << v) + 1;
3+
int u = r + n, v = __lg(min(u & -u, r - l)),
4+
m = r - (1 << v);
5+
if (T y = op(s[(u - 1) >> v], x); f(m, y))
6+
r = m, x = y;
7+
else l = m + 1;
78
}
8-
return r;
99
}

tests/library_checker_aizu_tests/data_structures/simple_tree_line.test.cpp

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,43 +34,55 @@ int main() {
3434
array<int, 2> res = st.query(l, r);
3535
{
3636
array<int, 2> walk_res = {1, 0};
37-
int idx = st.max_right(l, r,
38-
[&](const array<int, 2>& curr_line) -> bool {
37+
int idx = -1;
38+
st.max_right(l, r,
39+
[&](int m,
40+
const array<int, 2>& curr_line) -> bool {
3941
walk_res = curr_line;
42+
idx = m;
4043
return 1;
4144
});
4245
assert(res == walk_res);
4346
assert(idx == r);
4447
}
4548
{
4649
array<int, 2> walk_res = unit;
47-
int idx = st.max_right(l, r,
48-
[&](const array<int, 2>& curr_line) -> bool {
50+
int idx = -1;
51+
st.max_right(l, r,
52+
[&](int m,
53+
const array<int, 2>& curr_line) -> bool {
4954
walk_res = curr_line;
55+
idx = m;
5056
return 0;
5157
});
5258
assert(walk_res == st.query(l, l + 1));
53-
assert(idx == l);
59+
assert(idx == l + 1);
5460
}
5561
{
5662
array<int, 2> walk_res = unit;
57-
int idx = st.min_left(l, r,
58-
[&](const array<int, 2>& curr_line) -> bool {
63+
int idx = -1;
64+
st.min_left(l, r,
65+
[&](int m,
66+
const array<int, 2>& curr_line) -> bool {
5967
walk_res = curr_line;
68+
idx = m;
6069
return 1;
6170
});
6271
assert(walk_res == res);
6372
assert(idx == l);
6473
}
6574
{
6675
array<int, 2> walk_res = unit;
67-
int idx = st.min_left(l, r,
68-
[&](const array<int, 2>& curr_line) -> bool {
76+
int idx = -1;
77+
st.min_left(l, r,
78+
[&](int m,
79+
const array<int, 2>& curr_line) -> bool {
6980
walk_res = curr_line;
81+
idx = m;
7082
return 0;
7183
});
7284
assert(walk_res == st.query(r - 1, r));
73-
assert(idx == r);
85+
assert(idx == r - 1);
7486
}
7587
cout << (1LL * res[0] * x + res[1]) % mod << '\n';
7688
}

tests/library_checker_aizu_tests/data_structures/simple_tree_walk.test.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,22 @@ int main() {
2121
cout << st.query(k, k + 1) << '\n';
2222
} else if (type == 3) {
2323
// returns first element in [k,n) such that mx > 0
24-
int idx = st.max_right(k, n,
25-
[&](int mx) { return mx == 0; });
26-
if (idx == n) idx = -1;
24+
int idx = -1;
25+
st.max_right(k, n, [&](int m, int mx) {
26+
if (mx == 0) return 1;
27+
idx = m - 1;
28+
return 0;
29+
});
2730
cout << idx << '\n';
2831
} else {
2932
assert(type == 4);
30-
cout << st.min_left(0, k + 1,
31-
[&](int mx) { return mx == 0; }) -
32-
1 << '\n';
33+
int idx = -1;
34+
st.min_left(0, k + 1, [&](int m, int mx) {
35+
if (mx == 0) return 1;
36+
idx = m;
37+
return 0;
38+
});
39+
cout << idx << '\n';
3340
}
3441
}
3542
return 0;

0 commit comments

Comments
 (0)