Cod sursa(job #394403)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 10 februarie 2010 20:16:04
Problema Struti Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <cstdio>
#define LMAX 1010

int M, N, P, V[LMAX][LMAX], dmax[LMAX], dmin[LMAX], Max[LMAX][LMAX], Min[LMAX][LMAX], R[LMAX][LMAX];
int sol, count, dx, dy;

void solve()
{
	int i, j, stmax, stmin, hmax, hmin;
	for (i=1; i<=M; i++)
		{
			stmax=stmin=1;
			hmax=hmin=1;
			Max[i][dy]=0;
			for (j=1; j<=dy; j++) 
				if (V[i][j]>Max[i][dy]) 
				{
					Max[i][dy]=V[i][j];
					dmax[1]=j;
				}
			Min[i][dy]=9000;
			for (j=1; j<=dy; j++) 
				if (V[i][j]<Min[i][dy]) 
				{
					Min[i][dy]=V[i][j];
					dmin[1]=j;
				}
			for (j=dy+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 (j=dy+1; j<=N; j++)
			{
				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=dy; 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;
			R[i][j]=Max[dmax[stmax]][j];
		}
		for (i=1; i<=M; i++)
		{
			for (; dmin[stmin]+dx-1<i && stmin<=hmin; stmin++);
			for (; Min[i][j]<=Min[dmin[hmin]][j] && hmin>=stmin; hmin--);
			hmin++;
			dmin[hmin]=i;
			R[i][j]-=Min[dmin[stmin]][j];
		}
	}
}

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

int main()
{
	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);
	scanf("%d %d %d",&M, &N, &P);
	int 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);
	}
}