using
System;
public
class
GFG{
static
readonly
int
MAX = 500;
static
int
[,]lookup =
new
int
[MAX, MAX];
class
Query {
public
int
L, R;
public
Query(
int
l,
int
r) {
L = l;
R = r;
}
};
static
void
preprocess(
int
[]arr,
int
n)
{
for
(
int
i = 0; i < n; i++)
lookup[i,0] = i;
for
(
int
j = 1; (1 << j) <= n; j++) {
for
(
int
i = 0; (i + (1 << j) - 1) < n; i++) {
if
(arr[lookup[i,j - 1]]
< arr[lookup[i + (1 << (j - 1)),j - 1]])
lookup[i,j] = lookup[i,j - 1];
else
lookup[i,j]
= lookup[i + (1 << (j - 1)),j - 1];
}
}
}
static
int
query(
int
[]arr,
int
L,
int
R)
{
int
j = (
int
)Math.Log(R - L + 1);
if
(arr[lookup[L,j]]
<= arr[lookup[R - (1 << j) + 1,j]])
return
arr[lookup[L,j]];
else
return
arr[lookup[R - (1 << j) + 1,j]];
}
static
void
Min_difference(
int
[]arr,
int
n,
Query []q,
int
m)
{
preprocess(arr, n);
for
(
int
i = 0; i < m; i++) {
int
L = q[i].L, R = q[i].R;
Console.WriteLine(query(arr, L, R - 1));
}
}
static
void
minimumDifference(
int
[]arr, Query []q,
int
N,
int
m)
{
int
[]diff =
new
int
[N];
for
(
int
i = 0; i < N - 1; i++)
diff[i] = Math.Abs(arr[i] - arr[i + 1]);
Min_difference(diff, N - 1, q, m);
}
public
static
void
Main(String[] args)
{
int
[]arr = { 2, 6, 1, 8, 3, 4 };
int
N = arr.Length;
Query []Q = {
new
Query( 0, 3 ),
new
Query( 1, 5 ),
new
Query( 4, 5 ) };
int
M = Q.Length;
minimumDifference(arr, Q, N, M);
}
}