using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Collections;
public
class
GFG
{
public
static
HashSet<
int
> fibonacci =
new
HashSet<
int
>();
public
static
int
getMid(
int
s,
int
e)
{
return
s + (
int
)((e - s) / 2);
}
public
static
void
createHash(
int
maxElement)
{
var
prev = 0;
var
curr = 1;
fibonacci.Add(prev);
fibonacci.Add(curr);
while
(curr <= maxElement)
{
var
temp = curr + prev;
fibonacci.Add(temp);
prev = curr;
curr = temp;
}
}
public
static
int
MaxUtil(
int
[] st,
int
ss,
int
se,
int
l,
int
r,
int
node)
{
if
(l <= ss && r >= se)
{
return
st[node];
}
if
(se < l || ss > r)
{
return
-1;
}
var
mid = GFG.getMid(ss, se);
return
Math.Max(GFG.MaxUtil(st, ss, mid, l, r, 2 * node + 1),GFG.MaxUtil(st, mid + 1, se, l, r, 2 * node + 2));
}
public
static
void
updateValue(
int
[] arr,
int
[] st,
int
ss,
int
se,
int
index,
int
value,
int
node)
{
if
(index < ss || index > se)
{
Console.WriteLine(
"Invalid Input"
);
return
;
}
if
(ss == se)
{
arr[index] = value;
if
(fibonacci.Contains(value))
{
st[node] = value;
}
else
{
st[node] = -1;
}
}
else
{
var
mid = GFG.getMid(ss, se);
if
(index >= ss && index <= mid)
{
GFG.updateValue(arr, st, ss, mid, index, value, 2 * node + 1);
}
else
{
GFG.updateValue(arr, st, mid + 1, se, index, value, 2 * node + 2);
}
st[node] = Math.Max(st[2 * node + 1],st[2 * node + 2]);
}
return
;
}
public
static
int
getMax(
int
[] st,
int
n,
int
l,
int
r)
{
if
(l < 0 || r > n - 1 || l > r)
{
Console.Write(
"Invalid Input\n"
);
return
-1;
}
return
GFG.MaxUtil(st, 0, n - 1, l, r, 0);
}
public
static
int
constructSTUtil(
int
[] arr,
int
ss,
int
se,
int
[] st,
int
si)
{
if
(ss == se)
{
if
(fibonacci.Contains(arr[ss]))
{
st[si] = arr[ss];
}
else
{
st[si] = -1;
}
return
st[si];
}
var
mid = GFG.getMid(ss, se);
st[si] = Math.Max(GFG.constructSTUtil(arr, ss, mid, st, si * 2 + 1),GFG.constructSTUtil(arr, mid + 1, se, st, si * 2 + 2));
return
st[si];
}
public
static
int
[] constructST(
int
[] arr,
int
n)
{
var
x = (
int
)(Math.Ceiling(Math.Log(n) / Math.Log(2)));
var
max_size = 2 * (
int
)Math.Pow(2,x) - 1;
int
[] st =
new
int
[max_size];
GFG.constructSTUtil(arr, 0, n - 1, st, 0);
return
st;
}
public
static
void
Main(String[] args)
{
int
[] arr = {1, 3, 5, 7, 9, 11};
var
n = arr.Length;
var
maxEle = arr.Max();
GFG.createHash(maxEle);
int
[] st = GFG.constructST(arr, n);
Console.WriteLine(
"Maximum fibonacci number in given range = "
+ GFG.getMax(st, n, 1, 3).ToString());
GFG.updateValue(arr, st, 0, n - 1, 3, 8, 0);
Console.WriteLine(
"Updated Maximum fibonacci number in given range = "
+ GFG.getMax(st, n, 1, 3).ToString());
}
}