#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map> #define ll __int64
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8 using namespace std;
/*
二维RMQ模板题
同一维一样 用dp[row][col][i][j]表示(row,col)到(row+2^i,col+2^j)矩形内的最小值
查询
*/ int mapp[][];
int dpmax[][][][];
int dpmin[][][][];
int flag;
void RMQ_init2d(int m, int n)
{
for (int i = ; i <= m; i++)
{
for (int j = ; j <= n; j++)
{
dp[i][j][][] = dpmax[i][j][][] = mapp[i][j];
}
}
int t = log((double)n) / log(2.0); for (int i = ; i <= t; i++)
{
for (int j = ; j <= t; j++)
{
if (i == && j == )
{
continue;
}
for (int row = ; row + ( << i) - <= m; row++)
{
for (int col = ; col + ( << j) - <= n; col++)
{
if (i)
{
dpmax[row][col][i][j] = max(dpmax[row][col][i - ][j], dpmax[row + ( << (i - ))][col][i - ][j]);
dpmin[row][col][i][j] = min(dpmin[row][col][i - ][j], dpmin[row + ( << (i - ))][col][i - ][j]);
}
else
{
dpmax[row][col][i][j] = max(dpmin[row][col][i][j - ], dpmin[row][col + ( << (j - ))][i][j - ]);
dpmin[row][col][i][j] = min(dpmin[row][col][i][j - ], dpmin[row][col + ( << (j - ))][i][j - ]);
}
}
}
}
}
}
int RMQ_2dmax(int x1, int y1, int x2, int y2)
{
int k1 = log(double(x2 - x1 + )) / log(2.0);
int k2 = log(double(y2 - y1 + )) / log(2.0);
int m1 = dpmax[x1][y1][k1][k2];
int m2 = dpmax[x2 - ( << k1) + ][y1][k1][k2];
int m3 = dpmax[x1][y2 - ( << k2) + ][k1][k2];
int m4 = dpmax[x2 - ( << k1) + ][y2 - ( << k2) + ][k1][k2];
int _max = max(max(m1, m2), max(m3, m4));
return _max;
}
int RMQ_2dmin(int x1, int y1, int x2, int y2)
{
int k1 = log(double(x2 - x1 + )) / log(2.0);
int k2 = log(double(y2 - y1 + )) / log(2.0);
int m1 = dpmin[x1][y1][k1][k2];
int m2 = dpmin[x2 - ( << k1) + ][y1][k1][k2];
int m3 = dpmin[x1][y2 - ( << k2) + ][k1][k2];
int m4 = dpmin[x2 - ( << k1) + ][y2 - ( << k2) + ][k1][k2];
int _min = min(min(m1, m2), min(m3, m4));
return _min;
}
int main()
{
int n, m, t;
int x1, x2, y1, y2;
while (~scanf("%d%d", &m, &n))
{
for (int i = ; i <= m; i++)
{
for (int j = ; j <= n; j++)
{
scanf("%d", &mapp[i][j]);
}
}
RMQ_init2d(m, n);
scanf("%d", &t);
while (t--)
{
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
flag = ;
int _max = RMQ_2dmax(x1, y1, x2, y2);
printf("max:%d", _max);
int _min = RMQ_2dmin(x1, y1, x2, y2);
printf("min:%d\n", _min);
}
}
return ;
}