Cod sursa(job #394348)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 10 februarie 2010 19:29:32
Problema Struti Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <cstdio>
#define LMAX 1010

short M, N, P, V[LMAX][LMAX], dmax[LMAX], dmin[LMAX], Max[LMAX][LMAX], Min[LMAX][LMAX], MMax[LMAX][LMAX], MMin[LMAX][LMAX];
short sol, count, dx, dy;

void solve()
{
	short i, j, stmax, stmin, hmax, hmin;
	for (i=1; i<=M; i++)
		{
			stmax=stmin=1;
			hmax=hmin=0;
			for (j=1; j<=N; j++)
			{
				for (; dmax[stmax]+dy-1<j && stmax<=hmax; stmax++);
				for (; V[i][j]>=V[i][dmax[hmax]] && hmax>=stmax; hmax--);
				hmax++;
				dmax[hmax]=j;
				Max[i][j]=V[i][dmax[stmax]];
				for (; dmin[stmin]+dy-1<j && stmin<=hmin; stmin++);
				for (; V[i][j]<=V[i][dmin[hmin]] && hmin>=stmin; hmin--);
				hmin++;
				dmin[hmin]=j;
				Min[i][j]=V[i][dmin[stmin]];
			}
		}
	for (j=1; j<=N; j++) 
	{
		stmax=stmin=1;
		hmax=hmin=0;
		for (i=1; i<=M; i++)
		{
			for (; dmax[stmax]+dx-1<i && stmax<=hmax; stmax++);
			for (; Max[i][j]>=Max[dmax[hmax]][j] && hmax>=stmax; hmax--);
			hmax++;
			dmax[hmax]=i;
			MMax[i][j]=Max[dmax[stmax]][j];
			for (; dmin[stmin]+dx-1<i && stmin<=hmin; stmin++);
			for (; Min[i][j]<=Min[dmin[hmin]][j] && hmin>=stmin; hmin--);
			hmin++;
			dmin[hmin]=i;
			MMin[i][j]=Min[dmin[stmin]][j];
		}
	}
}

void calc()
{
	short i, j;
	for (i=dx; i<=M; i++)
		for (j=dy; j<=N; j++) 
			if (MMax[i][j]-MMin[i][j]<sol)
			{
				sol=MMax[i][j]-MMin[i][j];
				count=1;
			} else
			if (MMax[i][j]-MMin[i][j]==sol) count++;
}

int main()
{
	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);
	scanf("%d %d %d",&M, &N, &P);
	short i, j;
	for (i=1; i<=M; i++)
		for (j=1; j<=N; j++) scanf("%d",&V[i][j]);
	while (P--)
	{
		scanf("%d %d",&dx,&dy);
		solve();
		sol=9000;
		count=0;
		calc();
		if (dx!=dy)
		{
			i=dx;
			dx=dy;
			dy=i;
			solve();
			calc();
		}
		printf("%d %d\n",sol,count);
	}
}