Pagini recente » Cod sursa (job #326164) | Cod sursa (job #916210) | Cod sursa (job #241135) | Cod sursa (job #2269771) | Cod sursa (job #209772)
Cod sursa(job #209772)
#include <iostream>
#include <stdio.h>
using namespace std;
const int maxN = 1001;
const int maxP = 11;
const int INF = (1<<29);
short DEQ[2][ maxN ];
short SOL[2][ maxN ][ maxN ];
int N, M;
short 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;
}