#include<stdio.h>
#include<assert.h>
#include<algorithm>
using namespace std;
const int NMAX = 1001;
const int DIM = 10001;
int p[NMAX][NMAX],minp[NMAX][NMAX],maxp[NMAX][NMAX],dequemin[NMAX],dequemax[NMAX],poz;
char buff[DIM];
void citire(int &numar)
{
while(buff[poz]<'0' || buff[poz]>'9')
if(++poz==DIM) {
fread(buff,1,DIM,stdin);
poz=0;
}
numar=0;
while(buff[poz]>='0' && buff[poz]<='9') {
numar=numar*10+buff[poz]-48;
if(++poz==DIM) {
fread(buff,1,DIM,stdin);
poz=0;
}
}
}
void builtmin(int n, int m, int r, int c)
{
int deque[NMAX],st,dr,i,j;
for(j=1;j<=m;j++) {
st=1;
dr=0;
for(i=1;i<=n;i++) {
while(st<=dr && p[deque[dr]][j]>p[i][j])
dr--;
deque[++dr]=i;
if(i-r>=deque[st])
st++;
if(i>=r)
minp[i-r+1][j]=p[deque[st]][j];
}
}
}
void builtmax(int n, int m, int r, int c)
{
int deque[NMAX],st,dr,i,j;
for(j=1;j<=m;j++) {
st=1;
dr=0;
for(i=1;i<=n;i++) {
while(st<=dr && p[deque[dr]][j]<p[i][j])
dr--;
deque[++dr]=i;
if(i-r>=deque[st])
st++;
if(i>=r)
maxp[i-r+1][j]=p[deque[st]][j];
}
}
}
void solve(int n, int m, int r, int c, int &dmin, int &nr)
{
int i,j,stmin,drmin,stmax,drmax,d;
for(i=1;i<=n-r+1;i++) {
stmin=stmax=1;
drmin=drmax=0;
for(j=1;j<=m;j++) {
while(stmin<=drmin && minp[i][dequemin[drmin]]>minp[i][j])
drmin--;
dequemin[++drmin]=j;
while(stmax<=drmax && maxp[i][dequemax[drmax]]<maxp[i][j])
drmax--;
dequemax[++drmax]=j;
if(j-c>=dequemin[stmin])
stmin++;
if(j-c>=dequemax[stmax])
stmax++;
if(j>=c) {
d=maxp[i][dequemax[stmax]]-minp[i][dequemin[stmin]];
if(d<dmin) {
dmin=d;
nr=1;
}
else if(d==dmin)
nr++;
}
}
}
}
int main ()
{
int n,m,r,c,i,j,dmin,nr,k;
assert(freopen("struti.in","r",stdin));
assert(freopen("struti.out","w",stdout));
citire(n);
citire(m);
citire(k);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
citire(p[i][j]);
for(i=1;i<=k;i++) {
citire(r);
citire(c);
dmin=(1<<30);
nr=0;
builtmin(n,m,r,c);
builtmax(n,m,r,c);
solve(n,m,r,c,dmin,nr);
if(r!=c) {
swap(r,c);
builtmin(n,m,r,c);
builtmax(n,m,r,c);
solve(n,m,r,c,dmin,nr);
}
printf("%d %d\n",dmin,nr);
}
fclose(stdin);
fclose(stdout);
return 0;
}