#include <fstream>
#include <deque>
#define NMAX 1005
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int mat[NMAX][NMAX], n, m, p, MI[NMAX][NMAX], MA[NMAX][NMAX], lg1, lg2;
deque<int> maxxL, minnL, maxxC, minnC;
void addL(int i, int j, deque<int> &vMax, deque<int> &vMin, int vmi, int vma)
{
while(!vMin.empty() && vMin.back() > vmi)
vMin.pop_back();
vMin.push_back(vmi);
while(!vMax.empty() && vMax.back() < vma)
vMax.pop_back();
vMax.push_back(vma);
}
int solve(int l, int c, int& lg)
{
for(int i = 1; i <= n; ++i)
{
maxxL.clear();
minnL.clear();
for(int j = 1; j <= c; ++j)
addL(i, j, maxxL, minnL, mat[i][j], mat[i][j]);
for(int j = c; j <= m; ++j)
{
MI[i][j] = minnL.front();
MA[i][j] = maxxL.front();
if(minnL.front() == mat[i][j - c + 1])
minnL.pop_front();
if(maxxL.front() == mat[i][j - c + 1])
maxxL.pop_front();
addL(i, j + 1, maxxL, minnL, mat[i][j + 1], mat[i][j + 1]);
}
}
int minD = (1 << 30);
for(int j = c; j <= m; ++j){
maxxC.clear();
minnC.clear();
for(int i = 1; i <= l; ++i)
addL(i, j, maxxC, minnC, MI[i][j], MA[i][j]);
for(int i = l; i <= n; ++i)
{
int dis = maxxC.front() - minnC.front();
if(dis < minD){
minD = dis;
lg = 0;
}
if(dis == minD)
++lg;
if(minnC.front() == MI[i - l + 1][j])
minnC.pop_front();
if(maxxC.front() == MA[i - l + 1][j])
maxxC.pop_front();
addL(i + 1, j, maxxC, minnC, MI[i + 1][j], MA[i + 1][j]);
}
}
return minD;
}
int main()
{
fin >> n >> m >> p;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
fin >> mat[i][j];
for(int i = 1; i <= p; ++i)
{
int dx, dy;
fin >> dx >> dy;
lg1 = 0, lg2 = 0;
int val1 = solve(dx, dy, lg1);
int val2 = solve(dy, dx, lg2);
if(val1 == val2 && dx != dy)
fout << val1 << ' ' << lg1 + lg2 << '\n';
else
{
if(val1 < val2)
fout << val1 << ' ' << lg1 << '\n';
else fout << val2 << ' ' << lg2 << '\n';
}
}
return 0;
}