#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<deque>
using namespace std;
int n,m,p,q,a[1005][1005];
int ml[1005][1005];
int Ml[1005][1005];
int solve(int x,int y,int &nr)
{
memset(ml,0,sizeof(ml));
memset(Ml,0,sizeof(Ml));
///ml[i][j]=elementul minim de pe linia i, din intervalul j-y+1...j
///Ml[i][j]=elementul maxim de pe linia i, din intervalul j-y+1...j
for(int i=1;i<=n;i++)
{
deque<int> Q,q;
for(int j=1;j<=m;j++)
{
if(!q.empty() && j-q.front()==y)
q.pop_front();
if(!Q.empty() && j-Q.front()==y)
Q.pop_front();
while(!q.empty() && a[i][j]<=a[i][q.back()])
q.pop_back();
q.push_back(j);
while(!Q.empty() && a[i][j]>=a[i][Q.back()])
Q.pop_back();
Q.push_back(j);
if(j>=y)
ml[i][j]=a[i][q.front()],
Ml[i][j]=a[i][Q.front()];
}
}
nr=0;int ans=8001;
for(int j=y;j<=m;j++)
{
deque<int> Q,q;
for(int i=1;i<=n;i++)
{
if(!q.empty() && i-q.front()==x)
q.pop_front();
if(!Q.empty() && i-Q.front()==x)
Q.pop_front();
while(!q.empty() && ml[i][j]<=ml[q.back()][j])
q.pop_back();
q.push_back(i);
while(!Q.empty() && Ml[i][j]>=Ml[Q.back()][j])
Q.pop_back();
Q.push_back(i);
if(i>=x)
if(Ml[Q.front()][j]-ml[q.front()][j]<ans)
ans=Ml[Q.front()][j]-ml[q.front()][j],nr=1;
else
if(Ml[Q.front()][j]-ml[q.front()][j]==ans)
nr++;
}
}
return ans;
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
int k,i,j,M1,M2,nr1,nr2;
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&a[i][j]);
for(i=1;i<=k;i++)
{
scanf("%d%d",&p,&q);
M1=solve(p,q,nr1);
M2=solve(q,p,nr2);
if(M1<M2)
printf("%d %d\n",M1,nr1);
else
if(M1>M2)
printf("%d %d\n",M2,nr2);
else
if(p!=q)
printf("%d %d\n",M1,nr1+nr2);
else
printf("%d %d\n",M1,nr1);
}
return 0;
}