Pagini recente » Cod sursa (job #1842919) | Cod sursa (job #11109) | Cod sursa (job #39366) | Cod sursa (job #119761) | Cod sursa (job #1082153)
#include <fstream>
#include <deque>
using namespace std;
const int MAX_N = 1010;
deque <int> maxL, maxC, minL, minC;
int N, M, P, ans, cnt, a[MAX_N][MAX_N], b[MAX_N][MAX_N], c[MAX_N][MAX_N], d[MAX_N][MAX_N], e[MAX_N][MAX_N];
void solve( int lung, int lat ){
for( int i = 1; i <= N; ++i ){
if( !maxL.empty() ) maxL.clear();
if( !minL.empty() ) minL.clear();
for( int j = 1; j <= M; ++j ){
while( !maxL.empty() && a[i][j] >= a[i][maxL.back()] )
maxL.pop_back();
maxL.push_back( j );
if( maxL.front() == j - lung ) maxL.pop_front();
while( !minL.empty() && a[i][j] <= a[i][minL.back()] )
minL.pop_back();
minL.push_back( j );
if( minL.front() == j - lung ) minL.pop_front();
if( j >= lung ){
c[i][j] = a[i][minL.front()];
b[i][j] = a[i][maxL.front()];
}
}
}
for( int j = lung; j <= M; ++j ){
if( !maxC.empty() ) maxC.clear();
if( !minC.empty() ) minC.clear();
for( int i = 1; i <= N; ++i ){
while( !maxC.empty() && b[i][j] >= b[maxC.back()][j] )
maxC.pop_back();
maxC.push_back( i );
if( maxC.front() == i - lat ) maxC.pop_front();
while( !minC.empty() && c[i][j] <= c[minC.back()][j] )
minC.pop_back();
minC.push_back( i );
if( minC.front() == i - lat ) minC.pop_front();
if( i >= lat ){
e[i][j] = c[minC.front()][j];
d[i][j] = b[maxC.front()][j];
}
}
}
for( int i = lat; i <= N; ++i )
for( int j = lung; j <= M; ++j )
if( d[i][j] - e[i][j] < ans ){
ans = d[i][j] - e[i][j];
cnt = 1;
}
else if( d[i][j] - e[i][j] == ans ) ++cnt;
}
int main()
{
ifstream cin( "struti.in" );
ofstream cout( "struti.out" );
cin >> N >> M >> P;
for( int i = 1; i <= N; ++i )
for( int j = 1; j <= M; ++j )
cin >> a[i][j];
for(; P >= 1; --P ){
int x, y;
cin >> x >> y;
ans = 1e9;
cnt = 0;
if( x == y ) solve( x, y );
else {
solve( x, y );
solve( y, x );
}
cout << ans << " " << cnt << "\n";
}
cin.close();
cout.close();
return 0;
}