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);