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);
}