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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
pub struct Fenwick(Vec<i32>);
impl Fenwick {
pub fn new(size: usize) -> Self {
Self(vec![0; size + 1])
}
pub fn size(&self) -> usize {
self.0.len() - 1
}
pub fn add(
&mut self,
mut i: usize,
x: i32,
) {
let n = self.size();
assert!(i < n);
i += 1;
while i <= n {
self.0[i] += x;
i += 1 << i.trailing_zeros();
}
}
pub fn sum_lt(
&self,
mut i: usize,
) -> i32 {
assert!(i <= self.size());
let mut v = 0;
while i > 0 {
v += self.0[i];
i -= 1 << i.trailing_zeros();
}
v
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test() {
let mut fw = Fenwick::new(10);
fw.add(5, 1);
assert_eq!(fw.sum_lt(5), 0);
assert_eq!(fw.sum_lt(6), 1);
}
}