Skip to content

Commit 55cb044

Browse files
Fix test for lazy_segment_tree.binary_search; use std::move insted copy value in segment tree binary search.
1 parent e7bf37a commit 55cb044

File tree

3 files changed

+22
-20
lines changed

3 files changed

+22
-20
lines changed

library/mrpython/lazy_segment_tree.hpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -157,13 +157,13 @@ class lazy_segment_tree {
157157
while (l % 2 == 1) l /= 2;
158158
T vl = mergeData(v, data[l]);
159159
if (check(vl)) break;
160-
v = vl;
160+
v = std::move(vl);
161161
}
162162
while (l < n - 1) {
163163
pushdown(l);
164164
T vl = mergeData(v, data[l * 2 + 1]);
165165
if (!check(vl))
166-
l = l * 2 + 2, v = vl;
166+
l = l * 2 + 2, v = std::move(vl);
167167
else
168168
l = l * 2 + 1;
169169
}
@@ -184,13 +184,13 @@ class lazy_segment_tree {
184184
while (r % 2 == 0) r = (r - 1) / 2;
185185
T vl = mergeData(v, data[r]);
186186
if (check(vl)) break;
187-
v = vl;
187+
v = std::move(vl);
188188
}
189189
while (r < n - 1) {
190190
pushdown(r);
191-
T vr = mergeData(v, data[r * 2 + 2]);
192-
if (!check(vr))
193-
r = r * 2 + 1, v = vr;
191+
T vl = mergeData(v, data[r * 2 + 2]);
192+
if (!check(vl))
193+
r = r * 2 + 1, v = std::move(vl);
194194
else
195195
r = r * 2 + 2;
196196
}

library/mrpython/typical_segment_tree.hpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -113,12 +113,12 @@ template <typename T, typename MergeFunction> class typical_segment_tree {
113113
while (l % 2 == 1) l /= 2;
114114
T vl = merge(v, data[l]);
115115
if (check(vl)) break;
116-
v = vl;
116+
v = std::move(vl);
117117
}
118118
while (l < n - 1) {
119119
T vl = merge(v, data[l * 2 + 1]);
120120
if (!check(vl))
121-
l = l * 2 + 2, v = vl;
121+
l = l * 2 + 2, v = std::move(vl);
122122
else
123123
l = l * 2 + 1;
124124
}
@@ -138,12 +138,12 @@ template <typename T, typename MergeFunction> class typical_segment_tree {
138138
while (r % 2 == 0) r = (r - 1) / 2;
139139
T vl = merge(v, data[r]);
140140
if (check(vl)) break;
141-
v = vl;
141+
v = std::move(vl);
142142
}
143143
while (r < n - 1) {
144144
T vr = merge(v, data[r * 2 + 2]);
145145
if (!check(vr))
146-
r = r * 2 + 1, v = vr;
146+
r = r * 2 + 1, v = std::move(vr);
147147
else
148148
r = r * 2 + 2;
149149
}

library/test/lazy_segment_tree/binary_search.cpp

+12-10
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ TEST(lazy_segment_tree, find_first_right) {
1515
std::uniform_int_distribution<unsigned long long> q_dist(
1616
std::numeric_limits<unsigned>::min(),
1717
(unsigned long long)std::numeric_limits<unsigned>::max() * n);
18-
std::vector<unsigned> a(n);
18+
std::vector<unsigned long long> a(n);
1919
std::generate(a.begin(), a.end(), [&] { return val_dist(gen); });
2020
mrpython::lazy_segment_tree_add_add<unsigned long long> tree(a.begin(),
2121
a.end(), 0);
@@ -24,9 +24,9 @@ TEST(lazy_segment_tree, find_first_right) {
2424
std::size_t l = size_dist(gen), r = size_dist(gen);
2525
if (l > r) std::swap(l, r);
2626
assert(l < r + 1);
27-
unsigned long long ans =
28-
std::accumulate(a.begin() + l, a.begin() + r + 1, 0ull);
29-
EXPECT_EQ(tree.get(l, r + 1), ans);
27+
unsigned value = val_dist(gen);
28+
for (std::size_t i = l; i < r + 1; ++i) a[i] += value;
29+
tree.set(l, r + 1, value);
3030
} else {
3131
std::size_t l = size_dist(gen), v = q_dist(gen);
3232
size_t p = l;
@@ -36,7 +36,8 @@ TEST(lazy_segment_tree, find_first_right) {
3636
if (s > v) break;
3737
++p;
3838
}
39-
size_t out=tree.find_first_right(l, [&](unsigned long long x) { return x > v; });
39+
size_t out =
40+
tree.find_first_right(l, [&](unsigned long long x) { return x > v; });
4041
EXPECT_EQ(out, p);
4142
}
4243
}
@@ -53,7 +54,7 @@ TEST(lazy_segment_tree, find_last_left) {
5354
std::uniform_int_distribution<unsigned long long> q_dist(
5455
std::numeric_limits<unsigned>::min(),
5556
(unsigned long long)std::numeric_limits<unsigned>::max() * n);
56-
std::vector<unsigned> a(n);
57+
std::vector<unsigned long long> a(n);
5758
std::generate(a.begin(), a.end(), [&] { return val_dist(gen); });
5859
mrpython::lazy_segment_tree_add_add<unsigned long long> tree(a.begin(),
5960
a.end(), 0);
@@ -62,9 +63,9 @@ TEST(lazy_segment_tree, find_last_left) {
6263
std::size_t l = size_dist(gen), r = size_dist(gen);
6364
if (l > r) std::swap(l, r);
6465
assert(l < r + 1);
65-
unsigned long long ans =
66-
std::accumulate(a.begin() + l, a.begin() + r + 1, 0ull);
67-
EXPECT_EQ(tree.get(l, r + 1), ans);
66+
unsigned value = val_dist(gen);
67+
for (std::size_t i = l; i < r + 1; ++i) a[i] += value;
68+
tree.set(l, r + 1, value);
6869
} else {
6970
std::size_t l = size_dist(gen), v = q_dist(gen);
7071
size_t p = l;
@@ -74,7 +75,8 @@ TEST(lazy_segment_tree, find_last_left) {
7475
if (s > v) break;
7576
--p;
7677
}
77-
size_t out=tree.find_last_left(l, [&](unsigned long long x) { return x > v; });
78+
size_t out =
79+
tree.find_last_left(l, [&](unsigned long long x) { return x > v; });
7880
EXPECT_EQ(out, p);
7981
}
8082
}

0 commit comments

Comments
 (0)