#include <cstdio>
#include <deque>
#include <cstring>
#define MAX 1111
#define verif(D,DX) while(!D.empty() and D.front() < i - DX + 1)D.pop_front()
#define zbor(D,op,M) while(!D.empty() and M[i][now] op M[D.back()][now])D.pop_back()
#define bag push_back
using namespace std;
deque <int> mini;
deque <int> maxi;
int mat[MAX][MAX],bigger[MAX][MAX],smaller[MAX][MAX],n,m,ce_trebuie,nr,t;
void citesc();
void build_lin(int now,int maxy);
void build_col(int now,int maxx);
void main_building(int maxx,int maxy);
void afis();
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
citesc();
afis();
return 0;
}
void citesc()
{
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",mat[i]+j);
}
void main_building(int maxx,int maxy){
for(int i=1;i<=m;build_col(i,maxx),++i);
for(int i=1;i<=n-maxx+1;build_lin(i,maxy),++i);
}
void build_col(int now,int maxx){
mini.clear();maxi.clear();
for(int i=1;i<=n;++i){
verif(mini,maxx);
verif(maxi,maxx);
zbor(mini,<=,mat);
zbor(maxi,>=,mat);
mini.bag(i);
maxi.bag(i);
if(i>=maxx){
smaller[now][i-maxx+1]=mat[mini.front()][now];
bigger[now][i-maxx+1]=mat[maxi.front()][now];
}
}
}
void build_lin(int now,int maxy){
mini.clear();maxi.clear();
for(int i=1;i<=m;++i){
verif(mini,maxy);
verif(maxi,maxy);
zbor(mini,<=,smaller);
zbor(maxi,>=,bigger);
mini.bag(i);
maxi.bag(i);
if(i>=maxy){
int x=bigger[maxi.front()][now]-smaller[mini.front()][now];
if(x==ce_trebuie)++nr;
else if (x<ce_trebuie)ce_trebuie=x,nr=1;
}
}
}
void afis(){
int maxx,maxy;
for(scanf("%d%d",&maxx,&maxy),ce_trebuie=1<<29,nr=0;t;scanf("%d%d",&maxx,&maxy),printf("%d %d\n",ce_trebuie,nr),--t,ce_trebuie=1<<29,nr=0){
main_building(maxx,maxy);
if(maxx!=maxy)main_building(maxy,maxx);
}
}