Cod sursa(job #512795)

Utilizator mgntMarius B mgnt Data 14 decembrie 2010 16:45:43
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <cstdio>
using namespace std;

int const mn=1000,minval=0,maxval=8000;
int a[mn][mn],imin[mn],imax[mn],minv[mn][mn],maxv[mn][mn],M,N,P,di,dj,opt,cnt;

void solve()
{	int i,j,emin,fmin,emax,fmax,val;
	for(i=0;N>i;++i)
	{	emin=0;fmin=-1;
		emax=0;fmax=-1;
		for(j=0;M>j;++j)
		{	while((fmax>=emax)&&(a[i][imax[fmax]]<=a[i][j])){--fmax;}    imax[++fmax]=j;
			while(imax[emax]<=j-dj){++emax;}    maxv[i][j] =a[i][imax[emax]];
			while((fmin>=emin)&&(a[i][imin[fmin]]>=a[i][j])){--fmin;}    imin[++fmin]=j;
			while(imin[emin]<=j-dj){++emin;}    minv[i][j] =a[i][imin[emin]];
		}
	}
	for(j=dj-1;M>j;++j)
	{	emin=0;fmin=-1;
		emax=0;fmax=-1;
		for(i=0;N>i;++i)
		{	while((fmax>=emax)&&(maxv[imax[fmax]][j]<=maxv[i][j])){--fmax;}    imax[++fmax]=i;
			while(imax[emax]<=i-di){++emax;}   
			while((fmin>=emin)&&(minv[imin[fmin]][j]>=minv[i][j])){--fmin;}    imin[++fmin]=i;
			while(imin[emin]<=i-di){++emin;}
			if(di-1<=i)
			{	val =maxv[imax[emax]][j]-minv[imin[emin]][j];
				if(val<opt){opt=val;cnt=1;}
				else{if(opt==val){++cnt;}}
			}
		}
	}
}

int main()
{	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);
	int i,j;
	scanf("%d %d %d",&M,&N,&P);
	for(j=0;M>j;++j)
	{	for(i=0;N>i;++i)
		{scanf("%d",&a[i][j]);}
	}
	for(i=0;P>i;++i)
	{	scanf("%d %d",&di,&dj);
		opt=(maxval-minval+1);cnt=0;
		solve();
		if(di!=dj)
		{	j=di;di=dj;dj=j;
			solve();
		}
		printf("%d %d\n",opt,cnt);
	}
	return 0;
}