Cod sursa(job #34852)

Utilizator amadaeusLucian Boca amadaeus Data 21 martie 2007 15:37:27
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <cstdio>
#include <cassert>
#include <algorithm>

#define INF 0x3f3f3f3f
#define NX 501

using namespace std;

struct sol {
	int valmin, cnt;
	sol( int a = 0, int b = 0 ) {
		valmin = a, cnt = b;
	}
};

struct ent {
	int val, poz;
	ent( int a = 0, int b = 0 ) {
		val = a, poz = b;
	}
};

int a[NX][NX], c[NX][NX];
int M, N, P, DX, DY;

inline
void umin( int& x, int y ) {
	x > y ? x = y : 0 ;
}

inline
void umax( int& x, int y ) {
	x < y ? x = y : 0 ;
}

sol rez() {
	int i, j, ii, jj, vmin, vmax, minc, cnt;
	minc = INF;
	for( i = 1; i <= M - DX + 1; i++ )
		for( j = 1; j <= N - DY + 1; j++ ) {
			vmin = INF, vmax = 0;
			for( ii = i; ii <= i + DX - 1; ii++ )
				for( jj = j; jj <= j + DY - 1; jj++ ) {
					umin( vmin, a[ii][jj] );
					umax( vmax, a[ii][jj] );
				}
			c[i][j] = vmax - vmin;
			umin( minc, c[i][j] );
			assert( c[i][j] >= 0 );
		}
	cnt = 0;
	for( i = 1; i <= M - DX + 1; i++ )
		for( j = 1; j <= N - DY + 1; j++ )
			if( c[i][j] == minc )
				cnt++;
	return sol( minc, cnt );
}

void cit() {
	int i, j;
	
	scanf( "%d%d%d", &N, &M, &P );
	if( M > 150 || N > 150 )
		exit( 66 );
	for( i = 1; i <= M; i++ )
		for( j = 1; j <= N; j++ )
			scanf( "%d", &a[i][j] );

	for( ; P; P-- ) {
		scanf( "%d%d", &DX, &DY );
		sol x, y;
		x = rez();
		if( DX != DY ) {
			swap( DX, DY );
			y = rez();
			if( y.valmin < x.valmin )
				x = y;
			if( y.valmin == x.valmin )
				x.cnt += y.cnt;
		}
		printf( "%d %d\n", x.valmin, x.cnt );
	}
}

int main() {
	freopen( "struti.in", "r", stdin );
	freopen( "struti.out", "w", stdout );

	cit();

	return 0;
}