using
System;
class
GFG
{
public
static
int
[] minMaxRange(
int
[] arr,
int
D,
int
N)
{
int
max = 1, min = N;
for
(
int
i = 0; i < N; i++)
{
int
dist = leftSearch(
arr, arr[i] - D, i);
min = Math.Min(min, dist);
max = Math.Max(max, dist);
dist = rightSearch(
arr, arr[i] + D, i);
min = Math.Min(min, dist);
max = Math.Max(max, dist);
}
return
new
int
[] { min, max };
}
public
static
int
leftSearch(
int
[] arr,
int
val,
int
i)
{
if
(i == 0)
return
1;
int
left = 0, right = i - 1;
int
ind = -1;
while
(left <= right)
{
int
mid = (left + right) / 2;
if
(arr[mid] < val)
{
left = mid + 1;
}
else
{
right = mid - 1;
ind = mid;
}
}
return
ind != -1 ? i - ind + 1 : 1;
}
public
static
int
rightSearch(
int
[] arr,
int
val,
int
i)
{
if
(i == arr.Length - 1)
return
1;
int
left = i + 1;
int
right = arr.Length - 1;
int
ind = -1;
while
(left <= right)
{
int
mid = (left + right) / 2;
if
(arr[mid] > val)
{
right = mid - 1;
}
else
{
left = mid + 1;
ind = mid;
}
}
return
ind != -1 ? ind - i + 1 : 1;
}
public
static
void
Main()
{
int
[] arr = { 1, 3, 5, 9, 14 };
int
N = arr.Length;
int
D = 4;
int
[] minMax = minMaxRange(arr, D, N);
Console.Write(minMax[0] +
" "
+ minMax[1]);
}
}