Cod sursa(job #46814)

Utilizator pocaituDavid si Goliat pocaitu Data 2 aprilie 2007 23:33:13
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include<stdio.h>
#define nmax 1003
#define infi 32000
long n,min[nmax][nmax],a[nmax][nmax],m,max[nmax][nmax],df,nr;






void solve_min(long dx,long dy)
{long i,j,min1[nmax][nmax],st[nmax],sf,inc,poz[nmax];
 for(i=1;i<=n;i++)
   {sf=0;
	inc=1;
	poz[inc]=1;

	for(j=1;j<=dx;j++)
	 {while(sf>=inc&&st[sf]>=a[i][j]) sf--;
	  st[++sf]=a[i][j];
	  poz[sf]=j;
	  }

	min1[i][1]=st[inc];
	for(j=dx+1;j<=m;j++)
	 {
	  if(poz[inc]<=j-dx)
		inc++;
	  while(sf>=inc&&st[sf]>=a[i][j]) sf--;
	  st[++sf]=a[i][j];
	  poz[sf]=j;
	  min1[i][j-dx+1]=st[inc];
	  }
	}
 for(j=1;j<=m-dx+1;j++)
  {sf=0;
   inc=1;
   poz[inc]=1;
   for(i=1;i<=dy;i++)
	 {
	  while(sf>=inc&&st[sf]>=min1[i][j]) sf--;
	  st[++sf]=min1[i][j];
	  poz[sf]=i;
	  }

	min[1][j]=st[inc];
	for(i=dy+1;i<=n;i++)
	 {
	  if(poz[inc]<=i-dy)
		inc++;
	  while(sf>=inc&&st[sf]>=min1[i][j]) sf--;
	  st[++sf]=min1[i][j];
	  poz[sf]=i;
	  min[i-dy+1][j]=st[inc];

	  }
  }
}


void solve_max(long dx,long dy)
{long i,j,max1[nmax][nmax],st[nmax],sf,inc,poz[nmax];
 for(i=1;i<=n;i++)
   {sf=0;
	inc=1;
	poz[inc]=1;

	for(j=1;j<=dx;j++)
	 {while(sf>=inc&&st[sf]<=a[i][j]) sf--;
	  st[++sf]=a[i][j];
	  poz[sf]=j;
	  }

	max1[i][1]=st[inc];
	for(j=dx+1;j<=m;j++)
	 {
	  if(poz[inc]<=j-dx)
		inc++;
	  while(sf>=inc&&st[sf]<=a[i][j]) sf--;
	  st[++sf]=a[i][j];
	  poz[sf]=j;
	  max1[i][j-dx+1]=st[inc];
	  }
	}
 for(j=1;j<=m-dx+1;j++)
  {sf=0;
   inc=1;
   poz[inc]=1;
   for(i=1;i<=dy;i++)
	 {
	  while(sf>=inc&&st[sf]<=max1[i][j]) sf--;
	  st[++sf]=max1[i][j];
	  poz[sf]=i;
	  }

	max[1][j]=st[inc];
	for(i=dy+1;i<=n;i++)
	 {
	  if(poz[inc]<=i-dy)
		inc++;
	  while(sf>=inc&&st[sf]<=max1[i][j]) sf--;
	  st[++sf]=max1[i][j];
	  poz[sf]=i;
	  max[i-dy+1][j]=st[inc];

	  }
  }
}










void solve_dif(long dx,long dy)
{long i,j;
 for(i=1;i<=n-dy+1;i++)
  for(j=1;j<=m-dx+1;j++)
	if(df>max[i][j]-min[i][j])
	  {df=max[i][j]-min[i][j];
	   nr=1;
	   }
	else
	  if(df==max[i][j]-min[i][j])
		nr++;
}






int main()
{long i,j,dx,dy,t;

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


  scanf("%ld%ld%ld",&n,&m,&t);
 for(i=1;i<=n;i++)
  for(j=1;j<=m;j++)
   scanf("%ld",&a[i][j]);
 for(i=1;i<=t;i++)
  {scanf("%ld%ld",&dx,&dy);
   df=infi;
   nr=0;

   solve_min(dx,dy);
   solve_max(dx,dy);
   solve_dif(dx,dy);
  if(dx!=dy)
   {
   solve_min(dy,dx);
   solve_max(dy,dx);
   solve_dif(dy,dx);
   }

   printf("%ld %ld\n",df,nr);
   }

fclose(stdout);
return 0;
}