use proconio::input; fn main() { input! { n: usize, lr: [(i64, i64); n], } println!("{}", dfs(0, n, &mut vec![false; n], &mut vec![0; n], &lr)); } fn dfs(i: usize, n: usize, used: &mut [bool], permutation: &mut [usize], lr: &[(i64, i64)]) -> i64 { if i >= n { return if is_valid(permutation, lr) { 1 } else { 0 }; } let mut res = 0; for v in 0..n { if used[v] { continue; } used[v] = true; permutation[i] = v; res += dfs(i + 1, n, used, permutation, lr); used[v] = false; } res } fn is_valid(permutation: &[usize], lr: &[(i64, i64)]) -> bool { let mut difficulty = 0; for (l, r) in permutation.iter().map(|&i| lr[i]) { if difficulty > r { return false; } difficulty = difficulty.max(l); } true }