Cod sursa(job #209771)

Utilizator webspiderDumitru Bogdan webspider Data 24 septembrie 2008 17:11:17
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.72 kb
#include <iostream>
#include <stdio.h>

using namespace std;

const int maxN = 1001;
const int maxP = 11;
const int INF = (1<<29);

int DEQ[2][ maxN ];

int SOL[2][ maxN ][ maxN ];

int N, M;

int T[ maxN ][ maxN ];
int P;

int DX, DY;

int minC, nSolC;
int minT, nSolT;

void reInit() {
	bzero( SOL, sizeof( SOL ) );
	minC = INF; nSolC = 0;
}
inline bool cmp( int A, int B, int S ) {
	if ( S == 0 ) {
		return ( A > B );
	} else return ( A < B );
}
void get_sol( int X, int Y ) {
	int dE[2], dS[2];
	for ( int i = 0; i < N; i++ ) {
		bzero( dE, sizeof( dE ) );
		bzero( dS, sizeof( dS ) );
		DEQ[0][ 0 ] = 0;
		DEQ[1][ 0 ] = 0;
		SOL[0][i][0] = T[i][0];
		SOL[1][i][0] = T[i][0];
		for ( int j = 1; j < M; j++ )
			for ( int D=0; D<2; D++ ) {
				while ( dE[D] >= dS[D] && cmp( T[i][ DEQ[D][ dE[D] ] ] , T[i][j], D ) ) dE[D]--;
		    	dE[D]++;
				DEQ[D][ dE[D] ] = j;
				while ( DEQ[D][ dS[D] ] + Y-1 < j ) dS[D]++;
				SOL[D][i][j] = T[i][ DEQ[D][ dS[D] ] ];	
			}
	}
/*	for ( int D=0;D<2;D++ ) {
		for ( int i = 0; i < N; i++ ) {
			for ( int j = 0; j < M; j++ ) {
				printf("%d ", SOL[D][i][j] );
			}
			printf("\n");
		}
		printf("=================================\n");
	}*/
	for ( int j = 0; j < M; j++ ) {
		bzero( dE, sizeof( dE ) );
		bzero( dS, sizeof( dS ) );
		DEQ[0][ 0 ] = 0;
		DEQ[1][ 0 ] = 0;
		for ( int i = 1; i < N; i++ ) {
			for ( int D=0; D<2; D++ ) {
				while ( dE[D] >= dS[D] && cmp( SOL[D][ DEQ[D][ dE[D] ] ][ j ], SOL[D][i][j], D ) ) dE[D]--;
			    dE[D]++;
		   		DEQ[D][ dE[D] ] = i;
		 		while ( DEQ[D][ dS[D] ] + X-1 < i ) dS[D]++;
			}
			if ( i >= X-1 && j >= Y-1 ) {
				if ( SOL[1][ DEQ[1][ dS[1] ] ][j] - SOL[0][ DEQ[0][ dS[0] ] ][j] < minC ) {
					minC = SOL[1][ DEQ[1][ dS[1] ] ][j] - SOL[0][ DEQ[0][ dS[0] ]][j];
					//printf("%d %d -> %d\n", i+1, j+1, minC );
					nSolC = 1;
				} else {
					if ( SOL[1][ DEQ[1][ dS[1] ] ][j] - SOL[0][ DEQ[0][ dS[0] ] ][ j ] == minC ) {
						//printf("   + %d %d\n", i+1, j+1 );
						nSolC++;
					}
				}
			}	
		}
	}

}

int main()
{
#ifdef PC_RUN
	freopen("data.in","r",stdin);
	freopen("data.out","w",stdout);
#else
	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);
#endif

	scanf("%d %d %d\n", &N, &M, &P );

	for ( int i = 0; i < N; i++ )
		for ( int j = 0; j < M; j++ ) 
			scanf("%d ", &T[i][j] );

	for ( int k = 0; k < P; k++ ) {
		scanf("%d %d\n", &DX, &DY );
		reInit();
		minT = INF, nSolT = 0;
		if ( DX != DY ) {
			get_sol( DX, DY );
			minT = minC;
			nSolT = nSolC;
			//printf("%d\n", nSolT );
			reInit();
			get_sol( DY, DX );
			if ( minC < minT ) {
				minT = minC;
				nSolT = nSolC;
			} else {
				if ( minC == minT )
					nSolT += nSolC;
			}	
		} else { get_sol( DX, DY ); minT = minC; nSolT = nSolC; }
		printf("%d %d\n", minT, nSolT );
	}

	return 0;
}