#include <cstdio>
#include <cstring>
#include <algorithm>
#define schimb(a, b, c) ((a > b && c == 1) || (a < b && c == -1))
#define vfstv(a, b, c) ((a <= b && c == 1) || (a >= b && c == -1))
using namespace std;
const int INF = 1000000000;
const int NMAX = 1001;
const int MMAX = 1001;
typedef struct {int l, c;}coord;
coord st[NMAX][MMAX];
coord D[NMAX];
int A[NMAX][MMAX];
int N, M, P;
int NR = 0;
int f[MMAX];
int b[MMAX];
void initializari()
{
for(int i = 1 ; i <= N ; i++)
{
D[i].l = 0, D[i].c = 0;
for(int j = 1 ; j <= M ; j++)
st[i][j].l = 0, st[i][j].c = 0;
f[i] = 1;
b[i] = 0;
}
}
int linii(int x, int semn)
{
int val = -(semn * INF);
coord D[NMAX] = {0};
int fD = 1, bD = 0;
for(int i = 1 ; i <= N ; i++)
{
while(fD <= bD && vfstv(A[D[bD].l][D[bD].c], A[st[i][f[i]].l][st[i][f[i]].c], semn))
bD--;
D[++bD].l = st[i][f[i]].l;
D[bD].c = st[i][f[i]].c;
if(fD < i - x + 1)
fD++;
if(schimb(A[D[fD].l][D[fD].c], val, semn))
val = A[D[fD].l][D[fD].c];
}
return val;
}
int deque(int x, int y, int semn)
{
int val = -(semn * INF);
initializari();
for(int j = 1 ; j <= M ; j++)
{
for(int i = 1 ; i <= N ; i++)
{
while(f[i] <= b[i] && vfstv(A[st[i][b[i]].l][st[i][b[i]].c], A[i][j], semn))
b[i]--;
st[i][++b[i]].l = i;
st[i][b[i]].c = j;
if(f[i] < i - y + 1)
f[i]++;
}
if(j >= y)
{
int fct = linii(x, semn);
if(schimb(fct, val, semn))
{
val = fct;
NR = 0;
}
else if(fct == val)
NR++;
}
}
return val;
}
int main()
{
int x, y;
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%d%d%d",&N,&M,&P);
for(int i = 1 ; i <= N ; i ++)
for(int j = 1 ; j <= M ; j++)
scanf("%d",&A[i][j]);
for(int k = 1 ; k <= P ; k++)
{
scanf("%d%d",&x,&y);
if(x == y)
printf("%d %d\n",deque(x, y, 1) - deque(x, y, -1), NR);
else
{
int p = deque(x, y, 1) - deque(x, y, -1), NR2 = NR;
int q = deque(y, x, 1) - deque(y, x, -1);
if(p > q)
printf("%d %d\n", p, NR2);
else
printf("%d %d\n", q, NR);
}
}
return 0;
}