competitive/algorithm/syakutori.rs
1/// arg:
2/// - n: length of array
3/// - (l, r): ident of left-bound and right-bound
4/// - addable: |index| expr: return is addable element
5/// - add: |index| expr: add element
6/// - remove: |index| expr: remove element
7/// - show: call n times for l in 0..n, with rightmost r
8#[macro_export]
9macro_rules! syakutori {
10 (
11 $n:expr,
12 ($l:ident, $r:ident),
13 |$i:ident| $addable:expr,
14 |$j:ident| $add:expr,
15 |$k:ident| $remove:expr,
16 $show:expr $(,)?
17 ) => {{
18 let n: usize = $n;
19 let mut $r: usize = 0;
20 for $l in 0..n {
21 while $r < n && {
22 let $i: usize = $r;
23 let cond: bool = $addable;
24 cond
25 } {
26 let $j: usize = $r;
27 $add;
28 $r += 1;
29 }
30 $show;
31 if $l == $r {
32 $r += 1;
33 } else {
34 let $k: usize = $l;
35 $remove;
36 }
37 }
38 }};
39}