Cod sursa(job #240846)

Utilizator andrei.12Andrei Parvu andrei.12 Data 8 ianuarie 2009 20:13:34
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include<stdio.h>

#define lg 1005

int n, i, j, dx, dy, nrs, rz, A[lg][lg], B[lg][lg][2], m, p;
struct ches{
	int x, y;
};
ches q[lg][2];

void find(int X, int Y){
	int s1, s2, f1, f2, i, j;

	for (i = 1; i <= n; i ++){
		s1 = s2 = 1, f1 = f2 = 0;

		for (j = 1; j <= m; j ++){
			if (s1 < f1 && j - q[s1][0].y + 1 > X)
				s1 ++;
			while (s1 <= f1 && A[i][j] <= q[f1][0].x)
				f1 --;
			f1 ++; q[f1][0].x = A[i][j], q[f1][0].y = j;

			if (s2 < f2 && j - q[s2][1].y + 1 > X)
				s2 ++;
			while (s2 <= f2 && A[i][j] >= q[f2][1].x)
				f2 --;
			f2 ++; q[f2][1].x = A[i][j], q[f2][1].y = j;


			if (j >= X){
				B[i][j - X + 1][0] = q[s1][0].x;
				B[i][j - X + 1][1] = q[s2][1].x;
			}
		}
	}
/*
	for (i = 1; i <= n; i ++){
		for (j = 1; j <= m; j ++)
			printf("%d %d   ", B[i][j][0], B[i][j][1]);
		printf("\n");
	}
*/
	for (j = 1; j <= m - X + 1; j ++){
		s1 = s2 = 1, f1 = f2 = 0;

		for (i = 1; i <= n; i ++){
			if (s1 < f1 && i - q[s1][0].y + 1 > Y)
				s1 ++;
			while (s1 <= f1 && B[i][j][0] <= q[f1][0].x)
				f1 --;
			f1 ++; q[f1][0].x = B[i][j][0], q[f1][0].y = i;

			if (s2 < f2 && i - q[s2][1].y + 1 > Y)
				s2 ++;
			while (s2 <= f2 && B[i][j][1] >= q[f2][1].x)
				f2 --;
			f2 ++; q[f2][1].x = B[i][j][1], q[f2][1].y = i;

			if (i >= Y){
				if (q[s2][1].x - q[s1][0].x < rz){
					rz = q[s2][1].x - q[s1][0].x;
					nrs = 0;
				}
				if (q[s2][1].x - q[s1][0].x == rz)
					nrs ++;
			}
		}
	}
}

int main()
{
	freopen("struti.in", "rt", stdin);
	freopen("struti.out", "wt", stdout);

	scanf("%d%d%d", &n, &m, &p);
	for (i = 1; i <= n; i ++)
		for (j = 1; j <= m; j ++)
			scanf("%d", &A[i][j]);

	while (p --){
		scanf("%d%d", &dx, &dy);

		rz = 0x3f3f3f3f;
		find(dx, dy);
		if (dx != dy)
			find(dy, dx);

		printf("%d %d\n", rz, nrs);
	}

	return 0;
}