Skip to content

Commit 8af8260

Browse files
ranges (#44)
* ranges * lazy ranges
1 parent 13a89d3 commit 8af8260

File tree

3 files changed

+37
-34
lines changed

3 files changed

+37
-34
lines changed

examples/data_structures/lazy_seg_tree.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ fn main() {
2222
ri: usize,
2323
delta: u64
2424
}
25-
seg_tree.update(le - 1, ri, delta);
25+
seg_tree.update(le - 1..ri, delta);
2626
}
2727
_ => {
2828
input! {
2929
le: usize,
3030
ri: usize
3131
}
32-
println!("{}", seg_tree.query(le - 1, ri));
32+
println!("{}", seg_tree.query(le - 1..ri));
3333
}
3434
}
3535
}

examples/data_structures/seg_tree_build_on_array.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ fn main() {
2222
p: usize,
2323
x: u64
2424
}
25-
seg_tree.update(p, p + 1, x);
25+
seg_tree.update(p..p + 1, x);
2626
}
2727
_ => {
2828
input! {
2929
le: usize,
3030
ri: usize
3131
}
32-
println!("{}", seg_tree.query(le, ri));
32+
println!("{}", seg_tree.query(le..ri));
3333
}
3434
}
3535
}

src/data_structures/seg_tree.rs

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
//! # Segment Tree
22
3+
use std::ops::Range;
4+
35
/// see https://codeforces.com/blog/entry/112755
46
///
57
/// returns the split point of the range which
68
/// makes the segment tree a complete binary tree
7-
fn split(tl: usize, tr: usize) -> usize {
8-
let pw2 = 1 << (tr - tl).ilog2();
9-
(tl + pw2).min(tr - pw2 / 2)
9+
fn split(tr: &Range<usize>) -> usize {
10+
let pw2 = 1 << tr.len().ilog2();
11+
(tr.start + pw2).min(tr.end - pw2 / 2)
1012
}
1113

1214
fn op(vl: u64, vr: u64) -> u64 {
@@ -18,9 +20,9 @@ fn op(vl: u64, vr: u64) -> u64 {
1820
/// use programming_team_code_rust::data_structures::seg_tree::SegTree;
1921
///
2022
/// let mut seg_tree = SegTree::new(10);
21-
/// seg_tree.update(0, 5, 1);
22-
/// seg_tree.update(5, 10, 2);
23-
/// assert_eq!(seg_tree.query(0, 10), 15);
23+
/// seg_tree.update(0..5, 1);
24+
/// seg_tree.update(5..10, 2);
25+
/// assert_eq!(seg_tree.query(0..10), 15);
2426
/// ```
2527
pub struct SegTree {
2628
n: usize,
@@ -67,17 +69,18 @@ impl SegTree {
6769
}
6870
}
6971

70-
fn apply(&mut self, delta: u64, tl: usize, tr: usize, v: usize) {
71-
self.tree[v] += delta * (tr - tl) as u64;
72+
fn apply(&mut self, delta: u64, tr: &Range<usize>, v: usize) {
73+
self.tree[v] += delta * tr.len() as u64;
7274
if v < self.n {
7375
self.lazy[v] += delta;
7476
}
7577
}
7678

77-
fn push(&mut self, tl: usize, tm: usize, tr: usize, v: usize) {
79+
fn push(&mut self, tr: &Range<usize>, v: usize) {
7880
if self.lazy[v] > 0 {
79-
self.apply(self.lazy[v], tl, tm, 2 * v);
80-
self.apply(self.lazy[v], tm, tr, 2 * v + 1);
81+
let tm = split(tr);
82+
self.apply(self.lazy[v], &(tr.start..tm), 2 * v);
83+
self.apply(self.lazy[v], &(tm..tr.end), 2 * v + 1);
8184
self.lazy[v] = 0;
8285
}
8386
}
@@ -88,21 +91,21 @@ impl SegTree {
8891
/// # Complexity
8992
/// - Time: O(log(n))
9093
/// - Space: O(log(n)) due to the program stack
91-
pub fn update(&mut self, le: usize, ri: usize, delta: u64) {
92-
self.update_impl(le, ri, delta, 0, self.n, 1);
94+
pub fn update(&mut self, qr: Range<usize>, delta: u64) {
95+
self.update_impl(&qr, delta, &(0..self.n), 1);
9396
}
9497

95-
fn update_impl(&mut self, le: usize, ri: usize, delta: u64, tl: usize, tr: usize, v: usize) {
96-
if ri <= tl || tr <= le {
98+
fn update_impl(&mut self, qr: &Range<usize>, delta: u64, tr: &Range<usize>, v: usize) {
99+
if qr.end <= tr.start || tr.end <= qr.start {
97100
return;
98101
}
99-
if le <= tl && tr <= ri {
100-
return self.apply(delta, tl, tr, v);
102+
if qr.start <= tr.start && tr.end <= qr.end {
103+
return self.apply(delta, tr, v);
101104
}
102-
let tm = split(tl, tr);
103-
self.push(tl, tm, tr, v);
104-
self.update_impl(le, ri, delta, tl, tm, 2 * v);
105-
self.update_impl(le, ri, delta, tm, tr, 2 * v + 1);
105+
let tm = split(tr);
106+
self.push(tr, v);
107+
self.update_impl(qr, delta, &(tr.start..tm), 2 * v);
108+
self.update_impl(qr, delta, &(tm..tr.end), 2 * v + 1);
106109
self.tree[v] = op(self.tree[2 * v], self.tree[2 * v + 1]);
107110
}
108111

@@ -111,22 +114,22 @@ impl SegTree {
111114
/// # Complexity
112115
/// - Time: O(log(n))
113116
/// - Space: O(log(n)) due to the program stack
114-
pub fn query(&mut self, le: usize, ri: usize) -> u64 {
115-
self.query_impl(le, ri, 0, self.n, 1)
117+
pub fn query(&mut self, qr: Range<usize>) -> u64 {
118+
self.query_impl(&qr, &(0..self.n), 1)
116119
}
117120

118-
fn query_impl(&mut self, le: usize, ri: usize, tl: usize, tr: usize, v: usize) -> u64 {
119-
if ri <= tl || tr <= le {
121+
fn query_impl(&mut self, qr: &Range<usize>, tr: &Range<usize>, v: usize) -> u64 {
122+
if qr.end <= tr.start || tr.end <= qr.start {
120123
return 0;
121124
}
122-
if le <= tl && tr <= ri {
125+
if qr.start <= tr.start && tr.end <= qr.end {
123126
return self.tree[v];
124127
}
125-
let tm = split(tl, tr);
126-
self.push(tl, tm, tr, v);
128+
let tm = split(tr);
129+
self.push(tr, v);
127130
op(
128-
self.query_impl(le, ri, tl, tm, 2 * v),
129-
self.query_impl(le, ri, tm, tr, 2 * v + 1),
131+
self.query_impl(qr, &(tr.start..tm), 2 * v),
132+
self.query_impl(qr, &(tm..tr.end), 2 * v + 1),
130133
)
131134
}
132135
}

0 commit comments

Comments
 (0)