Pagini recente » Cod sursa (job #3152293) | Cod sursa (job #3275860) | Cod sursa (job #254729) | Cod sursa (job #2622404) | Cod sursa (job #1394692)
#include<stdio.h>
#define DIM 1005
#define INF 9000
FILE *f=fopen("struti.in","r"), *g=fopen("struti.out","w");
struct Coada{ long int ind, nr; } Qmin[DIM], Qmax[DIM], NOU;
long int N, M, T, t, MIN, NR, dx, dy, dif;
long int a[DIM][DIM], Dmin[DIM][DIM], Dmax[DIM][DIM];
void Citire(){
long int i, j;
fscanf(f,"%ld %ld %ld\n",&N,&M,&T);
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
fscanf(f,"%ld",&a[i][j]);
}
void Verifica( long int minim, long int maxim ){
dif = maxim - minim;
if( dif < MIN ){ MIN = dif; NR = 1; }
else if( dif == MIN ) NR++;
}
void Rezolva( long int DX, long int DY ){
long int i, j, pm, um, pM, uM, x;
for(i=1;i<=N;i++){
pm = 0; um = -1;
pM = 0; uM = -1;
for(j=1;j<=M;j++){
x = a[i][j];
while( pm <= um && Qmin[um].nr > x ) um --;
NOU.ind = j; NOU.nr = x; Qmin[++um] = NOU;
if( Qmin[pm].ind + DY - 1 < j ) pm ++;
if( j >= DY ) Dmin[i][j] = Qmin[pm].nr;
while( pM <= uM && Qmax[uM].nr < x ) uM --;
NOU.ind = j; NOU.nr = x; Qmax[++uM] = NOU;
if( Qmax[pM].ind + DY - 1 < j ) pM ++;
if( j >= DY ) Dmax[i][j] = Qmax[pM].nr;
}
}
for(j=DY;j<=M;j++){
pm = 0; um = -1;
pM = 0; uM = -1;
for(i=1;i<=N;i++){
x = Dmin[i][j];
while( pm <= um && Qmin[um].nr > x ) um --;
NOU.ind = i; NOU.nr = x; Qmin[++um] = NOU;
if( Qmin[pm].ind + DX - 1 < i ) pm ++;
x = Dmax[i][j];
while( pM <= uM && Qmax[uM].nr < x ) uM --;
NOU.ind = i; NOU.nr = x; Qmax[++uM] = NOU;
if( Qmax[pM].ind + DX - 1 < i ) pM ++;
if( i >= DX ) Verifica( Qmin[pm].nr, Qmax[pM].nr );
}
}
}
int main(){
Citire();
for(t=1;t<=T;t++){
fscanf(f,"%ld %ld\n",&dx,&dy);
MIN = INF; NR = 0;
Rezolva(dx,dy);
if( dx != dy ) Rezolva(dy,dx);
fprintf(g,"%ld %ld\n",MIN,NR);
}
return 0;
}