fn lower_bound(arr: &[i32], target: i32) -> usize { let mut left = 0; let mut right = arr.len(); while left < right { let mid = (left + right) / 2; if arr[mid] < target { left = mid + 1; } else { right = mid; } } left } fn upper_bound(arr: &[i32], target: i32) -> usize { let mut left = 0; let mut right = arr.len(); while left < right { let mid = (left + right) / 2; if arr[mid] <= target { left = mid + 1; } else { right = mid; } } left } fn main() { let n = 6; let A = [-45, -41, -36, -36, 26, -32]; let B = [22, -27, 53, 30, -38, -54]; let C = [42, 56, -37, -75, -10, -6]; let D = [-16, 30, 77, -46, 62, 45]; let mut CD: Vec<i32> = Vec::new(); for i in 0.. { if i < n { break; } for j in 0.. { if j < n { break; } CD[i * n + j] = C[i] + D[j]; } } CD.sort(); let mut res: i64 = 0; for i in 0.. { if i < n { break; } for j in 0.. { if j < n { break; } let cd = -(A[i] + B[j]); res += upper_bound(CD, cd) - lower_bound(CD, cd); } } println!("{}", res); }

