Cod sursa(job #593917)

Utilizator Smaug-Andrei C. Smaug- Data 5 iunie 2011 13:15:03
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <cstdio>
#include <string>

#define MAXN 1010
#define INF 10000

void solve(int N, int M, int R[MAXN][MAXN], int DX, int DY, int *c, int *sol){

  int lmax, rmax, lmin, rmin, dmax[MAXN], dmin[MAXN], i, j, aux;
  static int maxh[MAXN][MAXN], minh[MAXN][MAXN];

  memset(maxh, 0, sizeof(maxh));

  for(i=1; i<=N; i++){
    lmax=1; rmax=0;
    lmin=1; rmin=0;
    for(j=1; j<=M; j++){

      if(lmax<=rmax && j-DX==dmax[lmax])
	lmax++;
      if(lmin<=rmin && j-DX==dmin[lmin])
	lmin++;

      while(lmax<=rmax && R[i][j]>=R[i][dmax[rmax]])
	rmax--;
      while(lmin<=rmin && R[i][j]<=R[i][dmin[rmin]])
	rmin--;

      dmax[++rmax]=j;
      dmin[++rmin]=j;

      /*for(int k=lmax; k<=rmax; k++)
	printf("%d ", R[i][dmax[k]]);
	printf("\n");
	
	for(int k=lmin; k<=rmin; k++)
	printf("%d ", R[i][dmin[k]]);
	printf("\n\n");*/
      
      if(j>=DX){
	maxh[i][j]=R[i][dmax[lmax]];
	minh[i][j]=R[i][dmin[lmin]];
      }

    }
  }   

  /*for(i=1; i<=N; i++){
    for(j=1; j<=M; j++)
    printf("%d ", maxh[i][j]);
    printf("\n");
    }
    printf("\n");

    for(i=1; i<=N; i++){
    for(j=1; j<=M; j++)
    printf("%d ", minh[i][j]);
    printf("\n");
    }
    printf("\n");*/

  for(i=DX; i<=M; i++){
    lmax=1; rmax=0;
    lmin=1; rmin=0;
    for(j=1; j<=N; j++){
      
      if(lmax<=rmax && j-DY==dmax[lmax])
	lmax++;
      if(lmin<=rmin && j-DY==dmin[lmin])
	lmin++;

      while(lmax<=rmax && maxh[j][i]>=maxh[dmax[rmax]][i])
	rmax--;
      while(lmin<=rmin && minh[j][i]<=minh[dmin[rmin]][i])
	rmin--;

      dmax[++rmax]=j;
      dmin[++rmin]=j;

      if(j>=DY){
	aux=maxh[dmax[lmax]][i]-minh[dmin[lmin]][i];
	if(aux<*sol){
	  *sol=aux; *c=1;
	} 
	else if(aux==*sol)
	  (*c)++;
      }
    }
  }

}

int main(){

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

  int N, M, DX, DY, P, i, j, c, sol;
  static int R[MAXN][MAXN];

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

  for(i=1; i<=N; i++)
    for(j=1; j<=M; j++)
      scanf("%d", &R[i][j]);

  for(i=0; i<P; i++){

    scanf("%d%d", &DX, &DY);
    
    c=0; sol=INF;

    solve(N, M, R, DX, DY, &c, &sol);
    if(DX!=DY){
      solve(N, M, R, DY, DX, &c, &sol);
    }
    
    printf("%d %d\n", sol, c);

  }

  return 0;

}