Cod sursa(job #240198)

Utilizator marinMari n marin Data 6 ianuarie 2009 23:17:15
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.03 kb
#include <stdio.h>
#define DIM 1002
#define MAX 10000


int a[DIM][DIM];
int b[DIM][DIM];
int b1[DIM][DIM];
int dq[DIM][DIM];
int dq1[DIM][DIM];
int eq[DIM][DIM];
int eq1[DIM][DIM];
int rmin[DIM][DIM];
int rmax[DIM][DIM];

int X,Y,P,dx,dy,i,j,k,p,p1,u,u1,min,nr,aux;

int main(){
  FILE *f = fopen("struti.in","r");
  FILE *g = fopen("struti.out","w");
  fscanf(f,"%d%d%d",&X,&Y,&P);
  for (i=1;i<=X;i++)
    for (j=1;j<=Y;j++)
      fscanf(f,"%d",&a[i][j]);
  for (k=1;k<=P;k++){
    fscanf(f,"%d %d",&dx,&dy);

    for (j=1;j<=Y;j++){
      dq[1][j] = 1;
      p=1;u=1;
      for (i=2;i<=X;i++){
	while(p<=u && a[dq[u][j]][j]>a[i][j])
	  u--;
	dq[++u][j] = i;
	if (i>=dx)
	  b[i][j] = a[dq[p][j]][j];
	if (i-dx+1 == dq[p][j])
	  p++;

      }

      dq1[1][j]=1;
      p1=1;u1=1;
      for (i=2;i<=X;i++){
	while(p1<=u1 && a[dq1[u1][j]][j]<a[i][j])
	  u1--;
	dq1[++u1][j] = i;
	if (i>=dx)
	  b1[i][j] = a[dq1[p1][j]][j];
	if (i-dx+1 == dq1[p1][j])
	  p1++;

      }
    }


    for (i=dx;i<=X;i++) {
      eq[i][1] = 1;
      p=1;u=1;
      for (j=2;j<=Y;j++){
	while (p<=u && b[i][j]<b[i][eq[i][u]])
	  u--;
	eq[i][++u] = j;
	if (j>=dy)
	  rmin[i][j] = b[i][eq[i][p]];
	if (j-dy+1 == eq[i][p])
	  p++;

      }
      eq1[i][1] = 1;
      p1=1;u1=1;
      for (j=2;j<=Y;j++){
	while (p1<=u1 && b1[i][j]>b1[i][eq1[i][u1]])
	  u1--;
	eq1[i][++u1] = j;
	if (j>=dy)
	  rmax[i][j] = b1[i][eq1[i][p1]];
	if (j-dy+1 == eq1[i][p1])
	  p1++;

      }
    }

    min = MAX;
    nr = 0;
    for (i=dx;i<=X;i++)
      for (j=dy;j<=Y;j++)
	if (rmax[i][j]-rmin[i][j]<min){
	  min = rmax[i][j]-rmin[i][j];
	  nr = 1;
	} else
	  if (rmax[i][j]-rmin[i][j]==min)
	    nr++;

    if (dx!=dy) {

      aux = dx;
      dx = dy;
      dy = aux;



      for (j=1;j<=Y;j++){
	dq[1][j] = 1;
	p=1;u=1;
	for (i=2;i<=X;i++){
	  while(p<=u && a[dq[u][j]][j]>a[i][j])
	    u--;
	  dq[++u][j] = i;
	  if (i>=dx)
	    b[i][j] = a[dq[p][j]][j];
	  if (i-dx+1 == dq[p][j])
	    p++;

	}

	dq1[1][j]=1;
	p1=1;u1=1;
	for (i=2;i<=X;i++){
	  while(p1<=u1 && a[dq1[u1][j]][j]<a[i][j])
	    u1--;
	  dq1[++u1][j] = i;
	  if (i>=dx)
	    b1[i][j] = a[dq1[p1][j]][j];
	  if (i-dx+1 == dq1[p1][j])
	    p1++;

	}
      }


      for (i=dx;i<=X;i++) {
	eq[i][1] = 1;
	p=1;u=1;
	for (j=2;j<=Y;j++){
	  while (p<=u && b[i][j]<b[i][eq[i][u]])
	    u--;
	  eq[i][++u] = j;
	  if (j>=dy)
	    rmin[i][j] = b[i][eq[i][p]];
	  if (j-dy+1 == eq[i][p])
	    p++;

	}

	eq1[i][1] = 1;
	p1=1;u1=1;
	for (j=2;j<=Y;j++){
	  while (p1<=u1 && b1[i][j]>b1[i][eq1[i][u1]])
	    u1--;
	  eq1[i][++u1] = j;
	  if (j>=dy)
	    rmax[i][j] = b1[i][eq1[i][p1]];
	  if (j-dy+1 == eq1[i][p1])
	    p1++;

	}
      }
      for (i=dx;i<=X;i++)
	for (j=dy;j<=Y;j++)
	  if (rmax[i][j]-rmin[i][j]<min){
	    min = rmax[i][j]-rmin[i][j];
	    nr = 1;
	  } else
	    if (rmax[i][j]-rmin[i][j]==min)
	      nr++;




    }
    fprintf(g,"%d %d\n",min,nr);

  }
  fclose(f);
  fclose(g);
  return 0;
}