#include <deque>
#include <fstream>
#include <string>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
const int nmax= 1000;
const int hmax= 8000;
int v[nmax+1][nmax+1];
int sol, solnr, n, m, p;
deque <int> dm1, dm2, d1[nmax+1], d2[nmax+1];
string buffer;
string::iterator buffer_it;
inline void read_int_nn( int &x ) {
for ( ; *buffer_it<'0' || *buffer_it>'9'; ++buffer_it ) ;
for ( x= 0; *buffer_it>='0' && *buffer_it<='9'; x= x*10+*buffer_it-'0', ++buffer_it ) ;
}
inline void update1( deque <int> &d, int sign, int i, int j, int value ) {
while ( !d.empty() && sign*v[i][j]<sign*v[d.back()][j] ) {
d.pop_back();
}
d.push_back(i);
while ( !d.empty() && d.front()<=i-value ) {
d.pop_front();
}
}
inline void update2( deque <int> &d, deque <int> dp[], int sign, int j, int value ) {
while ( !d.empty() && sign*v[dp[d.back()].front()][d.back()]<sign*v[dp[j].front()][j] ) {
d.pop_back();
}
d.push_back(j);
while ( !d.empty() && d.front()<=j-value ) {
d.pop_front();
}
}
void query( int x, int y ) {
for ( int i= 1; i<=n; dm1.clear(), dm2.clear(), ++i ) {
for ( int j= 1; j<=m; ++j ) {
update1( d1[j], 1, i, j, x ), update1( d2[j], -1, i, j, x );
update2( dm1, d1 , -1, j, y ), update2( dm2, d2 , 1, j, y );
if ( x<=i && y<=j ) {
int value = v[d2[dm2.front()].front()][dm2.front()];
value-= v[d1[dm1.front()].front()][dm1.front()];
if ( value==sol ) {
++solnr;
} else if ( value<sol ) {
sol= value, solnr= 1;
}
}
}
}
for ( int i= 0; i<=nmax; d1[i].clear(), d2[i].clear(), ++i ) ;
}
int main( ) {
getline( fin, buffer, (char)0 );
buffer_it= buffer.begin();
read_int_nn(n), read_int_nn(m), read_int_nn(p);
for ( int i= 1; i<=n; ++i ) {
for ( int j= 1; j<=m; ++j ) {
read_int_nn(v[i][j]);
}
}
for ( int qr= 1; qr<=p; ++qr ) {
int x, y;
read_int_nn(x), read_int_nn(y);
sol= hmax, solnr= 0;
query( x, y );
if ( x!=y ) {
query( y, x );
}
fout<<sol<<" "<<solnr<<"\n";
}
return 0;
}