Skip to content

Commit 1f5281b

Browse files
committed
different style + nits
1 parent 706fadf commit 1f5281b

File tree

2 files changed

+26
-26
lines changed

2 files changed

+26
-26
lines changed
Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,49 @@
11
#pragma once
22
//! https://codeforces.com/blog/entry/125371?#comment-1173604
33
//! @code
4-
//! linear_rmq rmq1(a, less());//right-most min
5-
//! linear_rmq rmq2(a, less_equal());//left-most min
6-
//! linear_rmq rmq3(a, greater());//right-most max
7-
//! linear_rmq rmq4(a, greater_equal());//left-most max
4+
//! linear_rmq rmq1(a, less()); //right-most min
5+
//! linear_rmq rmq2(a, less_equal()); //left-most min
6+
//! linear_rmq rmq3(a, greater()); //right-most max
7+
//! linear_rmq rmq4(a, greater_equal()); //left-most max
88
//! linear_rmq rmq5(a, [&](auto& x, auto& y) {
99
//! return x < y;
1010
//! });
1111
//! @endcode
1212
//! @time O(n + q)
1313
//! @space O(n)
1414
template<class T, class F> struct linear_rmq {
15+
int n;
1516
vector<T> a;
1617
F cmp;
17-
vi head;
18-
vector<array<int, 2>> t;
18+
vi asc, in, head;
1919
linear_rmq(const vector<T>& a, F cmp):
20-
a(a), cmp(cmp), head(sz(a) + 1), t(sz(a)) {
20+
n(sz(a)), a(a), cmp(cmp), asc(n), in(n), head(n + 1) {
2121
vi st{-1};
22-
for (int i = 0; i <= sz(a); i++) {
22+
rep(i, 0, n + 1) {
2323
int prev = -1;
2424
while (st.back() != -1 &&
25-
(i == sz(a) || !cmp(a[st.back()], a[i]))) {
25+
(i == n || !cmp(a[st.back()], a[i]))) {
2626
if (prev != -1) head[prev] = st.back();
27-
int pw2 = 1 << __lg((end(st)[-2] + 1) ^ i);
28-
t[st.back()][0] = prev = i & -pw2;
27+
int pw2 = bit_floor((end(st)[-2] + 1u) ^ i);
28+
in[st.back()] = prev = i & -pw2;
2929
st.pop_back();
30-
t[st.back() + 1][1] |= pw2;
30+
asc[st.back() + 1] |= pw2;
3131
}
3232
if (prev != -1) head[prev] = i;
3333
st.push_back(i);
3434
}
35-
rep(i, 1, sz(a)) t[i][1] =
36-
(t[i][1] | t[i - 1][1]) & -(t[i][0] & -t[i][0]);
35+
rep(i, 1, n) asc[i] =
36+
(asc[i] | asc[i - 1]) & -(in[i] & -in[i]);
3737
}
38-
int query_idx(int l, int r) { // [l, r]
39-
if (unsigned j = t[l][0] ^ t[r][0]; j) {
40-
j = t[l][1] & t[r][1] & -bit_floor(j);
41-
if (unsigned k = t[l][1] ^ j; k)
42-
k = bit_floor(k), l = head[(t[l][0] & -k) | k];
43-
if (unsigned k = t[r][1] ^ j; k)
44-
k = bit_floor(k), r = head[(t[r][0] & -k) | k];
38+
int idx(int l, int r) { // [l, r]
39+
if (unsigned j = in[l] ^ in[r]; j) {
40+
j = asc[l] & asc[r] & -bit_floor(j);
41+
if (unsigned k = asc[l] ^ j; k)
42+
k = bit_floor(k), l = head[(in[l] & -k) | k];
43+
if (unsigned k = asc[r] ^ j; k)
44+
k = bit_floor(k), r = head[(in[r] & -k) | k];
4545
}
4646
return cmp(a[l], a[r]) ? l : r;
4747
}
48-
T query(int l, int r) { return a[query_idx(l, r)]; }
48+
T query(int l, int r) { return a[idx(l, r)]; }
4949
};

tests/library_checker_aizu_tests/data_structures/rmq_linear.test.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,21 @@ int main() {
1616
while (q--) {
1717
int l, r;
1818
cin >> l >> r;
19-
int idx_right_min = rmq_less.query_idx(l, r - 1);
19+
int idx_right_min = rmq_less.idx(l, r - 1);
2020
assert(idx_right_min + 1 == r ||
2121
rmq_less.query(idx_right_min + 1, r - 1) >
2222
a[idx_right_min]);
2323
assert(l <= idx_right_min && idx_right_min < r);
2424
assert(rmq_less.query(l, r - 1) == a[idx_right_min]);
2525
assert(
26-
idx_right_min == rmq_greater.query_idx(l, r - 1));
27-
int idx_left_min = rmq_less_equal.query_idx(l, r - 1);
26+
idx_right_min == rmq_greater.idx(l, r - 1));
27+
int idx_left_min = rmq_less_equal.idx(l, r - 1);
2828
assert(l == idx_left_min ||
2929
rmq_less_equal.query(l, idx_left_min - 1) >
3030
a[idx_left_min]);
3131
assert(l <= idx_left_min && idx_left_min < r);
3232
assert(idx_left_min ==
33-
rmq_greater_equal.query_idx(l, r - 1));
33+
rmq_greater_equal.idx(l, r - 1));
3434
assert(a[idx_right_min] == a[idx_left_min]);
3535
assert(idx_left_min <= idx_right_min);
3636
cout << a[idx_right_min] << '\n';

0 commit comments

Comments
 (0)