-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsegtree.rs
35 lines (35 loc) · 855 Bytes
/
segtree.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
struct SegTree<T> { a: Vec<T>, n: usize, f: fn(T, T) -> T }
impl<T: Copy> SegTree<T> {
fn new(size: usize, id: T, f: fn(T, T) -> T) -> SegTree<T> {
let mut n = 1;
while n < size { n <<= 1; }
let mut a = vec![id; n + size];
SegTree { a, n, f }
}
fn get(&self, i: usize) -> T { self.a[i + self.n] }
fn set(&mut self, mut i: usize, x: T) {
i += self.n;
self.a[i] = x;
while i > 1 {
i >>= 1;
self.a[i] = (self.f)(self.a[i << 1 | 0], self.a[i << 1 | 1]);
}
}
fn fold(&self, range: std::ops::Range<usize>) -> T {
let (mut l, mut r) = (range.start + self.n, range.end + self.n);
let (mut x, mut y) = (self.a[0], self.a[0]);
while l < r {
if (l & 1) == 1 {
x = (self.f)(x, self.a[l]);
l += 1;
}
l >>= 1;
if (r & 1) == 1 {
r -= 1;
y = (self.f)(self.a[r], y);
}
r >>= 1;
}
(self.f)(x, y)
}
}