mo_algorithm

Macro mo_algorithm 

Source
macro_rules! mo_algorithm {
    (
        $lr:expr,
        ($l:ident, $r:ident),
        |$i:tt| $inc:expr,
        |$d:tt| $dec:expr,
        |$a:tt| $answer:expr $(,)?
    ) => { ... };
    (
        $lr:expr,
        ($l:ident, $r:ident),
        |$il:tt| $incl:expr,
        |$dl:tt| $decl:expr,
        |$ir:tt| $incr:expr,
        |$dr:tt| $decr:expr,
        |$a:tt| $answer:expr $(,)?
    ) => { ... };
}
Expand description

solve with Mo’s algorithm

arg:

  • lr: slice of pair of usize
  • (l, r): ident of current pair
  • incl: |i| expr: del i, l+=1 (post)
  • decl: |i| expr: add i, l-=1 (pre)
  • incr: |i| expr: add i, r+=1 (post)
  • decr: |i| expr: del i, r-=1 (pre)
  • answer: |i| expr: answer i-th pair of lr

incr and decr can be omitted, if simultaneous

let (a, lr) = ([1, 2, 3], [(0, 1), (0, 2), (1, 3)]);
let (mut ans, mut acc) = (0, 0);
mo_algorithm!(
    &lr,
    (l, r),
    |i| acc -= a[i],
    |i| acc += a[i],
    |i| acc += a[i],
    |i| acc -= a[i],
    |i| ans += acc
);
assert_eq!(ans, 9);