competitive/math/
bitwise_transform.rs

1pub fn bitwise_transform<T, F>(x: &mut [T], mut f: F)
2where
3    F: FnMut(&mut T, &mut T),
4{
5    let k = x.len().trailing_zeros() as usize;
6    assert!(x.len() == 1 << k);
7    for i in 0..k {
8        for a in x.chunks_exact_mut(2 << i) {
9            let (x, y) = a.split_at_mut(1 << i);
10            for (x, y) in x.iter_mut().zip(y.iter_mut()) {
11                f(x, y);
12            }
13        }
14    }
15}