use proconio::{fastout, input}; #[fastout] fn main() { input! { n: usize, diff: [(u16, u16); n], } println!("{}", output(solve(n, diff))); } fn solve(n: usize, diff: Vec<(u16, u16)>) -> u16 { struct Fact<'a> { f: &'a dyn Fn(&Fact, u16, u8) -> u16, } let dfs = Fact { f: &|fact, prev_diff, flag| -> u16 { if flag as u16 == (1 << n) - 1 { return 1; } let mut ans = 0; for i in 0..n { let (l, r) = diff[i]; if (flag >> i) & 1 == 0 && prev_diff <= r { ans += (fact.f)(&fact, prev_diff.max(l), flag | (1 << i)); } } ans }, }; (dfs.f)(&dfs, 0, 0) } fn output(ans: u16) -> u16 { ans }