Cod sursa(job #257332)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 13 februarie 2009 00:37:16
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <cstdio>

int N, M, T, rez, cnt;
int d_min[1005], d_max[1005];
int a[1005][1005], b[1005][1005], minim[1005][1005], maxim[1005][1005], c[1005][1005];


void solve(int X, int Y)
{
	int i, j, p_min, u_min, p_max, u_max;

/*	for (i = 1; i <= N; i++)
	{
		for (j = 1; j <= M; j++) printf("%d ",b[i][j]);
		printf("\n");
	}
	printf("\n");
*/
	for (i = 1; i <= N; i++)
	{
		p_min = p_max = 1; u_min = u_max = 0;

		for (j = 1; j <= M; j++)
		{
			while (u_min >= p_min && b[i][j] < b[i][ d_min[u_min] ]) u_min--;
			d_min[ ++u_min ] = j;

			while (u_max >= p_max && b[i][j] > b[i][ d_max[u_max] ]) u_max--;
			d_max[ ++u_max ] = j;

			if (d_min[p_min] == j - Y) p_min++;
			if (d_max[p_max] == j - Y) p_max++;
			
			if (j >= Y)	
			{
				minim[i][j - Y + 1] = b[i][ d_min[p_min] ];
				maxim[i][j - Y + 1] = b[i][ d_max[p_max] ];
			}
		}
	}

	M -= (Y - 1);

/*	for (i = 1; i <= N; i++)
	{
		for (j = 1; j <= M; j++) printf("%d ",minim[i][j]);
		printf("\n");
	}
	printf("\n");

	for (i = 1; i <= N; i++)
	{
		for (j = 1; j <= M; j++) printf("%d ",maxim[i][j]);
		printf("\n");
	}


printf("sdagfda\n");

*/

	//////////
	for (j = 1; j <= M; j++)
	{
		p_min = p_max = 1; u_min = u_max = 0;

		for (i = 1; i <= N; i++)
		{
			while (u_min >= p_min && minim[i][j] < minim[ d_min[u_min] ][j]) u_min--;
			d_min[ ++u_min ] = i;

			while (u_max >= p_max && maxim[i][j] > maxim[ d_max[u_max] ][j]) u_max--;
			d_max[ ++u_max ] = i;

			if (d_min[p_min] == i - X) p_min++;
			if (d_max[p_max] == i - X) p_max++;
			
			if (i >= X)	c[i - X + 1][j] = maxim[ d_max[p_max] ][j] - minim[d_min[p_min] ][j];
		}
	}

	N -= (X - 1);

/*	for (i = 1; i <= N; i++)
	{
		for (j = 1; j <= M; j++) printf("%d ",c[i][j]);
		printf("\n");
	}
	printf("\n");
*/
	for (i = 1; i <= N; i++)
		for (j = 1; j <= M; j++)
		{
			if (c[i][j] < rez) rez = c[i][j], cnt = 1;
			else if (c[i][j] == rez) cnt++;
		}
}
				






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

	int i, j, X, Y, MM, NN;

	scanf("%d %d %d",&N,&M,&T);
	NN = N; MM = M;
	for (i = 1; i <= N; i++) 
		for (j = 1; j <= M; j++) scanf("%d",&a[i][j]);

	while (T--)
	{
		for (i = 1; i <= N; i++) 
			for (j = 1; j <= M; j++) b[i][j] = a[i][j];
		
		scanf("%d %d",&X,&Y);
		
		rez = (1<<30); cnt = 0;
		
		N = NN; M = MM;
		solve(X, Y);
		
		if (X != Y)
		{
			N = NN; M = MM;
			solve(Y, X);
		}

		printf("%d %d\n", rez, cnt);
	}
	return 0;
}