using
System;
public
class
GFG
{
static
void
prefixArr(
int
[] arr,
int
[,] prefix,
int
N)
{
for
(
int
i = 0; i < N; i++)
{
if
(i == 0)
{
prefix[i, 0] = arr[i];
prefix[i, 1] = arr[i];
}
else
{
prefix[i, 0] = Math.Max(prefix[i - 1, 0], arr[i]);
prefix[i, 1] = Math.Min(prefix[i - 1, 1], arr[i]);
}
}
}
static
void
suffixArr(
int
[] arr,
int
[,] suffix,
int
N)
{
for
(
int
i = N - 1; i >= 0; i--)
{
if
(i == N - 1)
{
suffix[i, 0] = arr[i];
suffix[i, 1] = arr[i];
}
else
{
suffix[i, 0] = Math.Max(suffix[i + 1, 0], arr[i]);
suffix[i, 1] = Math.Min(suffix[i + 1, 1], arr[i]);
}
}
}
static
void
maxAndmin(
int
[,] prefix,
int
[,] suffix,
int
N,
int
L,
int
R)
{
int
maximum, minimum;
if
(L == 0 && R == N - 1)
{
Console.WriteLine(
"No maximum and minimum value"
);
return
;
}
else
if
(L == 0)
{
maximum = suffix[R + 1, 0];
minimum = suffix[R + 1, 1];
}
else
if
(R == N - 1)
{
maximum = prefix[L - 1, 0];
minimum = prefix[R - 1, 1];
}
else
{
maximum = Math.Max(prefix[L - 1, 0],
suffix[R + 1, 0]);
minimum = Math.Min(prefix[L - 1, 1],
suffix[R + 1, 1]);
}
Console.WriteLine(maximum +
" "
+ minimum);
}
static
void
MinMaxQueries(
int
[] a,
int
[,] Q)
{
int
N = a.GetLength(0);
int
q = Q.GetLength(0);
int
[,] prefix =
new
int
[N, 2];
int
[,] suffix =
new
int
[N, 2];
prefixArr(a, prefix, N);
suffixArr(a, suffix, N);
for
(
int
i = 0; i < q; i++)
{
int
L = Q[i, 0];
int
R = Q[i, 1];
maxAndmin(prefix, suffix, N, L, R);
}
}
static
public
void
Main ()
{
int
[] arr = { 2, 3, 1, 8, 3, 5, 7, 4 };
int
[,] queries = { { 4, 6 }, { 0, 4 },
{ 3, 7 }, { 2, 5 } };
MinMaxQueries(arr, queries);
}
}