#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
const int maxn = 1000;
int v[maxn][maxn];
int minc[maxn][maxn];
int maxc[maxn][maxn];
int minl[maxn][maxn];
int maxl[maxn][maxn];
template <class cmp>
struct makeDQ {
static void f1D(int n, int m, int h, int w, int from[maxn][maxn], int result[maxn][maxn]) {
deque<int> goolah[maxn];
for (int i = h - 1; i < n; i++)
for (int j = 0; j < m; j++) {
while (!goolah[i].empty() && cmp()(from[i][j], from[i][goolah[i].back()]))
goolah[i].pop_back();
goolah[i].push_back(j);
if (goolah[i].back() - goolah[i].front() >= w)
goolah[i].pop_front();
result[i][j] = from[i][goolah[i].front()];
}
}
static void f2D(int n, int m, int maxlen, int arr[maxn][maxn]) {
deque<int> goolah[maxn];
for (int j = 0; j < m; j++) {
goolah[j].clear();
for (int i = 0; i < n; i++) {
while (!goolah[j].empty() && cmp()(v[i][j], v[goolah[j].back()][j]))
goolah[j].pop_back();
goolah[j].push_back(i);
if (goolah[j].back() - goolah[j].front() >= maxlen)
goolah[j].pop_front();
arr[i][j] = v[goolah[j].front()][j];
}
}
}
};
void query(int h, int w, int n, int m, int &mindif, int &cnt) {
makeDQ<less_equal<int>>::f2D(n, m, h, minc);
makeDQ<greater_equal<int>>::f2D(n, m, h, maxc);
makeDQ<less_equal<int>>::f1D(n, m, h, w, minc, minl);
makeDQ<greater_equal<int>>::f1D(n, m, h, w, maxc, maxl);
for (int i = h - 1; i < n; i++)
for (int j = w - 1; j < m; j++) {
int dif = maxl[i][j] - minl[i][j];
if (dif == mindif)
cnt++;
else if (dif < mindif) {
mindif = dif;
cnt = 1;
}
}
}
int main() {
int n, m, p;
fin >> n >> m >> p;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
fin >> v[i][j];
for (int i = 0; i < p; i++) {
int h, w;
fin >> h >> w;
int mindif = 2e9, cnt = 0;
query(h, w, n, m, mindif, cnt);
if (h != w)
query(w, h, n, m, mindif, cnt);
fout << mindif << ' ' << cnt << '\n';
}
return 0;
}