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}