using
System;
public
class
GFG {
const
int
N = 100;
static
int
[, ] matrix =
new
int
[N, N];
static
int
[, , , ] table
=
new
int
[N, N,
(
int
)(Math.Log(N) / Math.Log(2) + 1),
(
int
)(Math.Log(N) / Math.Log(2) + 1)];
static
void
buildSparseTable(
int
n,
int
m)
{
for
(
int
i = 0; i < n; i++) {
for
(
int
j = 0; j < m; j++) {
table[i, j, 0, 0] = matrix[i, j];
}
}
for
(
int
k = 1;
k <= (
int
)(Math.Log(n) / Math.Log(2)); k++) {
for
(
int
i = 0; i + (1 << k) - 1 < n; i++) {
for
(
int
j = 0; j + (1 << k) - 1 < m; j++) {
table[i, j, k, 0]
= Math.Min(table[i, j, k - 1, 0],
table[i + (1 << (k - 1)),
j, k - 1, 0]);
}
}
}
for
(
int
k = 1;
k <= (
int
)(Math.Log(m) / Math.Log(2)); k++) {
for
(
int
i = 0; i < n; i++) {
for
(
int
j = 0; j + (1 << k) - 1 < m; j++) {
table[i, j, 0, k] = Math.Min(
table[i, j, 0, k - 1],
table[i, j + (1 << (k - 1)), 0,
k - 1]);
}
}
}
for
(
int
k = 1;
k <= (
int
)(Math.Log(n) / Math.Log(2)); k++) {
for
(
int
l = 1;
l <= (
int
)(Math.Log(m) / Math.Log(2));
l++) {
for
(
int
i = 0; i + (1 << k) - 1 < n; i++) {
for
(
int
j = 0; j + (1 << l) - 1 < m;
j++) {
table[i, j, k, l] = Math.Min(
Math.Min(
table[i, j, k - 1, l - 1],
table[i + (1 << (k - 1)), j,
k - 1, l - 1]),
Math.Min(
table[i, j + (1 << (l - 1)),
k - 1, l - 1],
table[i + (1 << (k - 1)),
j + (1 << (l - 1)),
k - 1, l - 1]));
}
}
}
}
}
static
int
rmq(
int
x1,
int
y1,
int
x2,
int
y2)
{
int
k = (
int
)(Math.Log(x2 - x1 + 1) / Math.Log(2));
int
l = (
int
)(Math.Log(y2 - y1 + 1) / Math.Log(2));
return
Math.Max(
Math.Max(table[x1, y1, k, l],
table[x2 - (1 << k) + 1, y1, k, l]),
Math.Max(table[x1, y2 - (1 << l) + 1, k, l],
table[x2 - (1 << k) + 1,
y2 - (1 << l) + 1, k, l]));
}
static
void
solve(
int
n,
int
m,
int
[, ] matrix1,
int
q,
int
[, ] queries)
{
for
(
int
i = 0; i < n; i++) {
for
(
int
j = 0; j < m; j++) {
matrix[i, j] = matrix1[i, j];
}
}
buildSparseTable(n, m);
for
(
int
i = 0; i < q; i++) {
int
x1, y1, x2, y2;
x1 = queries[i, 0];
y1 = queries[i, 1];
x2 = queries[i, 2];
y2 = queries[i, 3];
Console.WriteLine(rmq(x1, y1, x2, y2));
}
}
static
public
void
Main()
{
int
N = 4, M = 4;
int
[, ] matrix1 = { { 5, 8, 2, 4 },
{ 7, 2, 9, 1 },
{ 1, 4, 7, 3 },
{ 3, 5, 6, 8 } };
int
Q = 2;
int
[, ] queries
= { { 0, 0, 3, 3 }, { 1, 1, 2, 2 } };
solve(N, M, matrix1, Q, queries);
}
}