#include<cstdio>
#include<fstream>
using namespace std;
FILE *f=fopen("struti.in","r");
ofstream g("struti.out");
int a[1002][1002],b[1002][1002],minim[1002][1002],maxim[1002][1002],v[1002],m,n,sol,k;
void Deque(int x,int y)
{
int Front,Back,i,j;
//minim
Front = 1, Back = 0; // Initializare, Back < Front => deque-ul este vid
for(i=1;i<=m;i++)
{
Front = 1, Back = 0;
for (j = 1; j <= n; j++)
{
// Cat timp elementul curent este mai mic decat ultimul element din deque, eliminam pozitia ultimului element din deque
while (Front <= Back && a[i][j] <= a[i][ v[Back] ]) Back--;
// Adaugam pozitia elementului curent in deque
v[++Back] = j;
// Daca elementul minim coincide cu cel de pe pozita i-K, ii eliminam pozitia din deque, deoarece acesta nu mai conteaza pentru pasii >= i
if (v[Front] == j-y) Front++;
// Afisam minimul, acesta aflandu-se in varful deque-ului
if (j >= y) b[i][j-y+1]= a[i][v[Front]];
}
}
for(j=1;j<=n-y+1;j++)
{
Front = 1, Back = 0;
for (i = 1; i <= m; i++)
{
// Cat timp elementul curent este mai mic decat ultimul element din deque, eliminam pozitia ultimului element din deque
while (Front <= Back && b[i][j] <= b[ v[Back] ][j]) Back--;
// Adaugam pozitia elementului curent in deque
v[++Back] = i;
// Daca elementul minim coincide cu cel de pe pozita i-K, ii eliminam pozitia din deque, deoarece acesta nu mai conteaza pentru pasii >= i
if (v[Front] == i-x) Front++;
// Afisam minimul, acesta aflandu-se in varful deque-ului
if (i >= x) minim[i-x+1][j]= b[v[Front]][j];
}
}
//maxim
Front = 1, Back = 0; // Initializare, Back < Front => deque-ul este vid
for(i=1;i<=m;i++)
{
Front = 1, Back = 0;
for (j = 1; j <= n; j++)
{
// Cat timp elementul curent este mai mic decat ultimul element din deque, eliminam pozitia ultimului element din deque
while (Front <= Back && a[i][j] >= a[i][ v[Back] ]) Back--;
// Adaugam pozitia elementului curent in deque
v[++Back] = j;
// Daca elementul minim coincide cu cel de pe pozita i-K, ii eliminam pozitia din deque, deoarece acesta nu mai conteaza pentru pasii >= i
if (v[Front] == j-y) Front++;
// Afisam minimul, acesta aflandu-se in varful deque-ului
if (j >= y) b[i][j-y+1]= a[i][v[Front]];
}
}
for(j=1;j<=n-y+1;j++)
{
Front = 1, Back = 0;
for (i = 1; i <= m; i++)
{
// Cat timp elementul curent este mai mic decat ultimul element din deque, eliminam pozitia ultimului element din deque
while (Front <= Back && b[i][j] >= b[ v[Back] ][j]) Back--;
// Adaugam pozitia elementului curent in deque
v[++Back] = i;
// Daca elementul minim coincide cu cel de pe pozita i-K, ii eliminam pozitia din deque, deoarece acesta nu mai conteaza pentru pasii >= i
if (v[Front] == i-x) Front++;
// Afisam minimul, acesta aflandu-se in varful deque-ului
if (i >= x) maxim[i-x+1][j]= b[v[Front]][j];
}
}
for(i=1;i<=m-x+1;i++)
for(j=1;j<=n-y+1;j++)
{
if(maxim[i][j]-minim[i][j]<sol)
sol=maxim[i][j]-minim[i][j],k=1;
else
if(maxim[i][j]-minim[i][j]==sol)
k++;
}
}
int main()
{
int p,i,j,l,x,y;
fscanf(f,"%d%d%d",&m,&n,&p);
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
fscanf(f,"%d",&a[i][j]);
for(l=1;l<=p;l++)
{
fscanf(f,"%d%d",&x,&y);
sol=10000;
k=0;
Deque(x,y);
if(x!=y)
Deque(y,x);
g<<sol<<" "<<k<<'\n';
}
return 0;
}