using
System;
class
GFG {
public
static
int
[] maxProdClosest(
int
[] arr1,
int
[] arr2)
{
int
M = arr1.Length, N = arr2.Length;
int
[] ans =
new
int
[M];
Array.Sort(arr2);
for
(
int
i = 0; i < M; i++) {
int
ind = binarySearch(arr1[i], arr2);
if
(ind == 0) {
ans[i] = arr2[ind] * arr2[ind + 1];
}
else
if
(ind == N - 1) {
ans[i] = arr2[ind] * arr2[ind - 1];
}
else
{
if
(Math.Abs(arr2[ind - 1] - arr1[i])
< Math.Abs(arr2[ind + 1] - arr1[i])) {
ans[i] = arr2[ind] * arr2[ind - 1];
}
else
if
(
Math.Abs(arr2[ind - 1] - arr1[i])
> Math.Abs(arr2[ind + 1] - arr1[i])) {
ans[i] = arr2[ind] * arr2[ind + 1];
}
else
{
ans[i] = Math.Max(
arr2[ind] * arr2[ind - 1],
arr2[ind] * arr2[ind + 1]);
}
}
}
return
ans;
}
public
static
int
binarySearch(
int
num,
int
[] arr)
{
int
mid = -1, left = 0, right = arr.Length - 1;
int
closestInd = -1;
int
smallestDiff = Int32.MaxValue;
while
(left <= right) {
mid = (left + right) >> 1;
if
(Math.Abs(arr[mid] - num) < smallestDiff) {
smallestDiff = Math.Abs(arr[mid] - num);
closestInd = mid;
}
else
if
(Math.Abs(arr[mid] - num)
== smallestDiff) {
if
(arr[mid] > arr[closestInd])
closestInd = mid;
}
if
(arr[mid] == num) {
return
mid;
}
else
if
(arr[mid] < num) {
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return
closestInd;
}
public
static
void
Main(
string
[] args)
{
int
[] arr1 = { 5, 10, 17, 22, -1 };
int
[] arr2 = { -1, 26, 5, 20, 14, 17, -7 };
int
[] res = maxProdClosest(arr1, arr2);
for
(
int
i = 0; i < res.Length; i++) {
Console.Write(res[i] +
" "
);
}
}
}