Cod sursa(job #238307)

Utilizator ProtomanAndrei Purice Protoman Data 1 ianuarie 2009 20:27:45
Problema Struti Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <stdio.h>
#include <algorithm>
#define mx 1024

using namespace std;

struct coord
{
	short x, y;
}; 
short cdqmm[mx][mx], cdqmn[mx][mx];
int n, m, p, x, y, soll, solc; 
short stmm, stmn, ctmm, ctmn;
short alt[mx][mx];

inline void cauta(int lx, int ly)
{
	coord dqmm[mx], dqmn[mx];
	short cctmm[mx], cctmn[mx], cstmm[mx], cstmn[mx];

	for (int i = 1 ; i <= m; i++)
	{
		cstmm[i] = cstmn[i] = 1;
		cctmm[i] = cctmn[i] = 0;
	}
	for (int i = 1; i <= n; i++)
	{
		ctmm = ctmn = 0;
		stmm = stmn = 1;
		for (int j = 1; j <= m; j++)
		{
			cdqmm[j][++cctmm[j]] = cdqmn[j][++cctmn[j]] = i;

			// update deque pe coloane

			for (; cctmm[j] > cstmm[j] 
				&& alt[cdqmm[j][cctmm[j]]][j] > alt[cdqmm[j][cctmm[j] - 1]][j];
				cctmm[j]--)
				swap(cdqmm[j][cctmm[j]], cdqmm[j][cctmm[j] - 1]);
			if (cdqmm[j][cstmm[j]] < i + 1 - lx)
				cstmm[j]++;
			for (; cctmn[j] > cstmn[j] 
				&& alt[cdqmn[j][cctmn[j]]][j] < alt[cdqmn[j][cctmn[j] - 1]][j];
				cctmn[j]--)
				swap(cdqmn[j][cctmn[j]], cdqmn[j][cctmn[j] - 1]);
			if (cdqmn[j][cstmn[j]] < i + 1 - lx)
				cstmn[j]++;

			// update deque pe dreptunghi

			dqmm[++ctmm].x = cdqmm[j][cstmm[j]];
			dqmn[++ctmn].x = cdqmn[j][cstmn[j]];
			dqmm[ctmm].y = dqmn[ctmn].y = j;
			for (; ctmm > stmm
				&& alt[dqmm[ctmm].x][dqmm[ctmm].y] > alt[dqmm[ctmm - 1].x][dqmm[ctmm - 1].y];
				ctmm--)
				swap(dqmm[ctmm], dqmm[ctmm - 1]);
			if (dqmm[stmm].x < i + 1 - lx || dqmm[stmm].y < j + 1 - ly)
				stmm++;
			for (; ctmn > stmn
				&& alt[dqmn[ctmn].x][dqmn[ctmn].y] < alt[dqmn[ctmn - 1].x][dqmn[ctmn - 1].y];
				ctmn--)
				swap(dqmn[ctmn], dqmn[ctmn - 1]);
			if (dqmn[stmn].x < i + 1 - lx || dqmn[stmn].y < j + 1 - ly)
				stmn++;
			int l = alt[dqmm[stmm].x][dqmm[stmm].y] - alt[dqmn[stmn].x][dqmn[stmn].y];
			if (i < lx || j < ly)
				continue;
			if (l < soll)
			{
				soll = l;
				solc = 0;
			}
			if (l == soll)
				solc++;
		}
	}
}

int main()
{
	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);
	scanf("%d %d %d", &n, &m, &p);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			scanf("%d", &alt[i][j]);
	for (; p; p--)
	{
		scanf("%d %d", &x, &y);
		soll = LONG_MAX;
		solc = 0;
		cauta(x, y);
		if (x != y)
			cauta(y, x);
		printf("%d %d\n", soll, solc);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}