4 values

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