use proconio::input; fn main() { input! { n: usize, lr: [(usize, usize); n], } let mut index: Vec = (0..n).collect(); let mut ans = 0; loop { let mut diff = 0; let mut flag = true; for &i in &index { let (l, r) = lr[i]; if diff > r { flag = false; } diff = diff.max(l); } if flag { ans += 1; } if !next_permutation(&mut index) { break; } } println!("{}", ans); } fn next_permutation(arr: &mut Vec) -> bool { let mut l = usize::MAX; for i in (0..arr.len() - 1).rev() { if arr[i] < arr[i + 1] { l = i; break; } } if l == usize::MAX { return false; } let mut r = usize::MAX; for i in (0..arr.len()).rev() { if arr[l] < arr[i] { r = i; break; } } arr.swap(l, r); arr[l + 1..].reverse(); return true; }