#include<cstdio>
#include<deque>
#include<cstring>
#define INF (1 << 30)
using namespace std;
int N, M, P, X, Y;
int v[1002][1002], Min[1002][1002], Max[1002][1002];
deque <int> deq, DEQ;
int Solve(int, int, int &);
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
int i, j, A, B, NR1, NR2;
scanf("%d%d%d", &N, &M, &P);
for (i = 1; i <= N; i++)
for (j = 1; j <= M; j++)
scanf("%d", &v[i][j]);
for ( ; P; P--)
{
scanf("%d%d", &X, &Y);
A = Solve(X, Y, NR1);
B = Solve(Y, X, NR2);
if (A < B)
printf("%d %d\n", A, NR1);
else
if (A > B)
printf("%d %d\n", B, NR2);
else
if (X != Y)
printf("%d %d\n", A, NR1 + NR2);
else
printf("%d %d\n", A, NR1);
}
}
int Solve(int x, int y, int &nr)
{
int i, j;
memset(Min, 0, sizeof(Min));
memset(Max, 0, sizeof(Max));
for (int i = 1; i <= N; i++)
{
deq.resize(0);
DEQ.resize(0);
for (int j = 1; j <= M; j++)
{
if (!deq.empty() && j - deq.front() == y)
deq.pop_front();
if (!DEQ.empty() && j - DEQ.front() == y)
DEQ.pop_front();
while (!deq.empty() && v[i][j] <= v[i][deq.back()])
deq.pop_back();
while (!DEQ.empty() && v[i][j] >= v[i][DEQ.back()])
DEQ.pop_back();
deq.push_back(j);
DEQ.push_back(j);
if (j >= y)
{
Min[i][j] = v[i][deq.front()];
Max[i][j] = v[i][DEQ.front()];
}
}
}
nr = 0; int sol = INF;
for (j = y; j <= M; j++)
{
deq.resize(0);
DEQ.resize(0);
for (i = 1; i <= N; i++)
{
if (!deq.empty() && i - deq.front() == x)
deq.pop_front();
if (!DEQ.empty() && i - DEQ.front() == x)
DEQ.pop_front();
while (!deq.empty() && Min[i][j] <= Min[deq.back()][j])
deq.pop_back();
while (!DEQ.empty() && Max[i][j] >= Max[DEQ.back()][j])
DEQ.pop_back();
deq.push_back(i);
DEQ.push_back(i);
if (i >= x)
{
if (Max[DEQ.front()][j] - Min[deq.front()][j] < sol)
sol = Max[DEQ.front()][j] - Min[deq.front()][j], nr = 1;
else
if (Max[DEQ.front()][j] - Min[deq.front()][j] == sol)
nr++;
}
}
}
return sol;
}