#include <cstdio>
#include <cstring>
#define NMAX 1024
#define PMAX 32
#define INF 1 << 20
using namespace std;
int N, M, P;
int V[NMAX][NMAX], st_min[NMAX][NMAX], stv_min[PMAX][NMAX], st_max[NMAX][NMAX],
stv_max[PMAX][NMAX], b_min[PMAX][NMAX], b_max[PMAX][NMAX], bv_min[PMAX], bv_max[PMAX],
vf_min[NMAX], vf_max[NMAX], vfv_min[PMAX], vfv_max[PMAX], sol[PMAX],
nr[PMAX], dx[PMAX], dy[PMAX];
inline int poz_j(int i, int k, bool min) {
if (min)
return V[i][st_min[i][b_min[k][i]]];
else
return V[i][st_max[i][b_max[k][i]]];
}
void print_sol() {
for (int i = 0; i < P; i++)
if (dx[i] == dy[i]) {
printf("%d %d\n", sol[i], nr[i]);
}
else {
int max_sol, nr_max;
if (sol[i] < sol[i + 1])
max_sol = sol[i], nr_max = nr[i];
else
if (sol[i] == sol[i + 1])
max_sol = sol[i], nr_max = nr[i] + nr[i + 1];
else
max_sol = sol[i + 1], nr_max = nr[i + 1];
printf("%d %d\n", max_sol, nr_max);
i++;
}
}
void solve() {
memset(vf_min, -1, NMAX * sizeof(int));
memset(vf_max, -1, NMAX * sizeof(int));
memset(vfv_min, -1, PMAX * sizeof(int));
memset(vfv_max, -1, PMAX * sizeof(int));
for (int i = 0; i < P; i++)
sol[i] = INF;
for (int j = 0; j < M; j++) {
for (int i = 0; i < P; i++) {
vfv_min[i] = -1, vfv_max[i] = -1;
bv_min[i] = 0, bv_max[i] = 0;
}
for (int i = 0; i < N; i++) {
int val = V[i][j];
while (vf_min[i] >= 0 && V[i][st_min[i][vf_min[i]]] >= val)
vf_min[i]--;
st_min[i][++vf_min[i]] = j;
while (vf_max[i] >= 0 && V[i][st_max[i][vf_max[i]]] <= val)
vf_max[i]--;
st_max[i][++vf_max[i]] = j;
for (int k = 0; k < P; k++) {
if (b_min[k][i] > vf_min[i])
b_min[k][i] = vf_min[i];
while (j - st_min[i][b_min[k][i]] >= dx[k])
b_min[k][i]++;
int val_v = V[i][st_min[i][b_min[k][i]]];
while (vfv_min[k] >= bv_min[k] && poz_j(stv_min[k][vfv_min[k]], k, true) >= val_v)
vfv_min[k]--;
stv_min[k][++vfv_min[k]] = i;
while (i - stv_min[k][bv_min[k]] >= dy[k])
bv_min[k]++;
if (b_max[k][i] > vf_max[i])
b_max[k][i] = vf_max[i];
while (j - st_max[i][b_max[k][i]] >= dx[k])
b_max[k][i]++;
val_v = V[i][st_max[i][b_max[k][i]]];
while (vfv_max[k] >= bv_max[k] && poz_j(stv_max[k][vfv_max[k]], k, false) <= val_v)
vfv_max[k]--;
stv_max[k][++vfv_max[k]] = i;
while (i - stv_max[k][bv_max[k]] >= dy[k])
bv_max[k]++;
int poz_min = poz_j(stv_min[k][bv_min[k]], k, true);
int poz_max = poz_j(stv_max[k][bv_max[k]], k, false);
if (i + 1 < dy[k] || j + 1 < dx[k])
continue;
if (poz_max - poz_min < sol[k])
sol[k] = poz_max - poz_min, nr[k] = 1;
else
if (poz_max - poz_min == sol[k])
nr[k]++;
}
}
}
}
int main()
{
freopen("struti.in", "r", stdin);
freopen("struti.out", "w", stdout);
scanf("%d %d %d", &N, &M, &P);
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
scanf ("%d", &V[i][j]);
int actual_p = 0;
for (int i = 0; i < P; i++) {
int x, y;
scanf ("%d %d", &x, &y);
dx[actual_p] = x, dy[actual_p++] = y;
if (x != y)
dx[actual_p] = y, dy[actual_p++] = x;
}
P = actual_p;
solve();
print_sol();
return 0;
}