Prefix Sum
fn build<T>(arr: &[T]) -> Vec<T>
where
T: Default + Copy + std::ops::Add<Output = T>,
{
let mut pref = vec![T::default(); arr.len()];
pref[0] = arr[0];
for i in 1..arr.len() {
pref[i] = pref[i - 1] + arr[i];
}
pref
}
// i..j
fn query<T>(pref: &[T], i: usize, j: usize) -> T
where
T: Default + Copy + std::ops::Sub<Output = T>,
{
if i == j {
T::default()
} else if i == 0 {
pref[j - 1]
} else {
pref[j - 1] - pref[i - 1]
}
}