Pagini recente » Cod sursa (job #203678) | Cod sursa (job #230473) | Cod sursa (job #1370343) | Cod sursa (job #3226513) | Cod sursa (job #34820)
Cod sursa(job #34820)
// struti - infoarena
#include <cstdio>
#include <deque>
#include <algorithm>
#define NX 1001
#define INF 0x3f3f3f3f
#define DBG 0
using namespace std;
struct ent {
int poz, val;
ent( int a = 0, int b = 0 ) {
poz = a, val = b;
}
};
int a[ NX ][ NX ], c[ NX ][ NX ];
#if DBG
int matmax[ NX ][ NX ], matmin[ NX ][ NX ];
#endif
int N, M, DX, DY, P;
deque< ent > Cmax[ NX ], Cmin[ NX ], Lmax, Lmin;
inline
void umin( int& x, int y ) {
if( x > y )
x = y;
}
ent rez() {
int x, r, i, j, cnt;
/*
for( i = 1; i < DX; i++ )
for( j = 1; j <= M; j++ ) {
x = a[i][j];
while( !Cmax[j].empty() && Cmax[j].back().val < x )
Cmax[j].pop_back();
Cmax[j].push_back( ent( i, x ) );
while( !Cmin[j].empty() && Cmin[j].back().val > x )
Cmin[j].pop_back();
Cmin[j].push_back( ent( i, x ) );
}
*/
r = INF;
for( j = 1; j <= M; j++ ) {
Cmax[j].clear();
Cmin[j].clear();
}
for( i = 1; i <= N; i++ ) {
Lmax.clear();
Lmin.clear();
for( j = 1; j <= M; j++ ) {
x = a[i][j];
if( !Cmax[j].empty() && Cmax[j].front().poz < i - DX + 1 )
Cmax[j].pop_front();
while( !Cmax[j].empty() && Cmax[j].back().val < x )
Cmax[j].pop_back();
Cmax[j].push_back( ent( i, x ) );
if( !Cmin[j].empty() && Cmin[j].front().poz < i - DX + 1 )
Cmin[j].pop_front();
while( !Cmin[j].empty() && Cmin[j].back().val > x )
Cmin[j].pop_back();
Cmin[j].push_back( ent( i, x ) );
#if DBG
matmax[i][j] = Cmax[j].front().val;
matmin[i][j] = Cmin[j].front().val;
#endif
if( i < DX )
continue;
x = Cmax[j].front().val;
if( !Lmax.empty() && Lmax.front().poz < j - DY + 1 )
Lmax.pop_front();
while( !Lmax.empty() && Lmax.back().val < x )
Lmax.pop_back();
Lmax.push_back( ent( j, x ) );
x = Cmin[j].front().val;
if( !Lmin.empty() && Lmin.front().poz < j - DY + 1 )
Lmin.pop_front();
while( !Lmin.empty() && Lmin.back().val > x )
Lmin.pop_back();
Lmin.push_back( ent( j, x ) );
if( i >= DX && j >= DY ) {
x = Lmax.front().val - Lmin.front().val;
c[ i - DX + 1 ][ j - DY + 1 ] = x;
umin( r, x );
}
}
}
#if DBG
printf( "=============\n" );
printf( "DX = %d DY = %d\n", DX, DY );
for( i = 1; i<= N; i++ ) {
for( j = 1; j <= M; j++ )
printf( "%3d", matmax[i][j] );
printf( "\n\n" );
}
#endif
cnt = 0;
for( i = 1; i <= N - DX + 1; i++ )
for( j = 1; j <= M - DY + 1; j++ )
if( c[i][j] == r )
cnt++;
return ent( r, cnt );
}
void cit() {
int i, j;
ent x, y;
scanf( "%d%d%d", &N, &M, &P );
for( i = 1; i <= N; i++ )
for( j = 1; j <= M; j++ )
scanf( "%d", &a[i][j] );
for( ; P; P-- ) {
scanf( "%d%d", &DX, &DY );
x = rez(); y = ent( 0, INF );
if( DX != DY ) {
swap( DX, DY );
y = rez();
if( x.poz > y.poz )
x = y;
if( x.poz == y.poz )
x.val += y.val;
}
printf( "%d %d\n", x.poz, x.val );
}
}
int main() {
freopen( "struti.in", "r", stdin );
freopen( "struti.out", "w", stdout );
cit();
return 0;
}