#include <stdio.h>
int
lower_bound(
int
arr[],
int
low,
int
high,
int
X)
{
if
(low > high) {
return
low;
}
int
mid = low + (high - low) / 2;
if
(arr[mid] >= X) {
return
lower_bound(arr, low,
mid - 1, X);
}
return
lower_bound(arr, mid + 1,
high, X);
}
int
upper_bound(
int
arr[],
int
low,
int
high,
int
X)
{
if
(low > high)
return
low;
int
mid = low + (high - low) / 2;
if
(arr[mid] <= X) {
return
upper_bound(arr, mid + 1,
high, X);
}
return
upper_bound(arr, low,
mid - 1, X);
}
void
printBound(
int
arr[],
int
N,
int
X)
{
int
idx;
if
(lower_bound(arr, 0, N, X) == N) {
printf
(
"Lower bound doesn't exist"
);
}
else
{
idx = lower_bound(arr, 0, N, X);
printf
(
"Lower bound of %d "
"is %d at index %d\n"
,
X, arr[idx], idx);
}
if
(upper_bound(arr, 0, N, X) == N) {
printf
(
"Upper bound doesn't exist"
);
}
else
{
idx = upper_bound(arr, 0, N, X);
printf
(
"Upper bound of %d is"
"% d at index % d\n "
,
X,
arr[idx], idx);
}
}
int
main()
{
int
arr[] = { 4, 6, 10, 12, 18, 20 };
int
N =
sizeof
(arr) /
sizeof
(arr[0]);
int
X = 6;
printBound(arr, N, X);
return
0;
}