using
System;
public
class
GFG{
static
int
MAX = 100005;
static
bool
[] isFib =
new
bool
[MAX];
static
int
[] prefix =
new
int
[MAX],
suffix =
new
int
[MAX];
static
void
precompute()
{
int
prev = 0, curr = 1;
isFib[prev] = isFib[curr] =
true
;
while
(curr + prev < MAX)
{
int
temp = curr + prev;
isFib[temp] =
true
;
prev = curr;
curr = temp;
}
prefix[1] = 1;
suffix[MAX - 1] = (
int
)1e9 + 7;
for
(
int
i = 2; i < MAX; i++)
{
if
(isFib[i])
prefix[i] = i;
else
prefix[i] = prefix[i - 1];
}
for
(
int
i = MAX - 2; i > 1; i--)
{
if
(isFib[i])
suffix[i] = i;
else
suffix[i] = suffix[i + 1];
}
}
static
int
query(
int
L,
int
R)
{
if
(prefix[R] < L || suffix[L] > R)
return
0;
else
return
prefix[R] - suffix[L];
}
static
int
minDifference(
int
L,
int
R)
{
int
fst = 0;
for
(
int
i = L; i <= R; i++)
{
if
(isFib[i])
{
fst = i;
break
;
}
}
int
snd = 0;
for
(
int
i = fst + 1; i <= R; i++)
{
if
(isFib[i])
{
snd = i;
break
;
}
}
if
(snd == 0)
return
-1;
int
diff = snd - fst;
int
left = snd + 1;
int
right = R;
for
(
int
i = left; i <= right; i++)
{
if
(isFib[i])
{
if
(i - snd <= diff)
{
fst = snd;
snd = i;
diff = snd - fst;
}
}
}
return
diff;
}
static
void
findAns(
int
[,] arr,
int
q)
{
precompute();
for
(
int
i = 0; i < q; i++)
{
Console.WriteLine(
"Maximum Difference: "
+
query(arr[i,0], arr[i,1]));
Console.WriteLine(
"Minimum Difference: "
+
minDifference(arr[i,0], arr[i,1]));
}
}
static
public
void
Main ()
{
int
q = 1;
int
[,] arr = { { 21, 100 } };
findAns(arr, q);
}
}