#include<fstream>
#include<string.h>
using namespace std;
const int NMAX = 1001;
ifstream f("struti.in");
ofstream g("struti.out");
int p[NMAX][NMAX],minp[NMAX][NMAX],maxp[NMAX][NMAX],dequemin[NMAX],dequemax[NMAX];
char buff[NMAX*NMAX*7];
void citire(int i)
{
int numar,m,poz,l;
f.get(buff,NMAX*NMAX*7-1);
f.get();
m=strlen(buff)-1;
l=0;
for(poz=0;poz<=m;poz++) {
while(buff[poz]<'0' || buff[poz]>'9')
poz++;
numar=0;
while(buff[poz]>='0' && buff[poz]<='9' && poz<=m) {
numar=numar*10+buff[poz]-48;
poz++;
}
p[i][++l]=numar;
}
}
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,dmin,nr,k;
f>>n>>m>>k;
f.get();
for(i=1;i<=n;i++)
citire(i);
for(i=1;i<=k;i++) {
f>>r>>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);
}
g<<dmin<<" "<<nr<<'\n';
}
f.close();
g.close();
return 0;
}