Cod sursa(job #258216)

Utilizator ProtomanAndrei Purice Protoman Data 14 februarie 2009 21:04:26
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <algorithm>
#include <stdio.h>
#include <vector>

#define MAX 1024
#define pb push_back
#define mp make_pair
#define f first
#define s second

using namespace std;

int n, m, p, rez, nrSol;
int lg[MAX];
short matAlt[MAX][MAX];
short matRminq[MAX][MAX][11], matRmaxq[MAX][MAX][11];

inline void preCalc()
{
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			matRminq[i][j][0] = matRmaxq[i][j][0] = matAlt[i][j];

	for (int lc = 0; lc < 10; lc++)
	{
		int lg2 = 1 << lc;

		for (int i = 1; i <= n - lg2 + 1; i++)
			for (int j = 1; j <= m - lg2 + 1; j++)
			{
				matRminq[i][j][lc + 1] = min(matRminq[i][j][lc], matRminq[i][j + lg2][lc]);
				matRmaxq[i][j][lc + 1] = max(matRmaxq[i][j][lc], matRmaxq[i][j + lg2][lc]);
			}
	}
}

inline void check(short lungX, short lungY)
{
	for (int j = 1; j <= m - lungY + 1; j++)
	{
		vector <pair <short, short> > dqMax, dqMin;
		int stDqMax = 1, stDqMin = 1;
		dqMax.pb(mp(0, 0)), dqMin.pb(mp(0, 0));

		for (int i = 1; i <= n; i++)
		{
			dqMax.pb(mp(max(matRmaxq[i][j][lg[lungY]], matRmaxq[i][j + lungY - (1 << lg[lungY])][lg[lungY]]), i));
			dqMin.pb(mp(min(matRminq[i][j][lg[lungY]], matRminq[i][j + lungY - (1 << lg[lungY])][lg[lungY]]), i));

			for (; stDqMax < dqMax.size() - 1 && dqMax[dqMax.size() - 1].f > dqMax[dqMax.size() - 2].f; dqMax.pop_back())
				swap(dqMax[dqMax.size() - 1], dqMax[dqMax.size() - 2]);
			if (dqMax[stDqMax].s < i + 1 - lungX)
				stDqMax++;
			
			for (; stDqMin < dqMin.size() - 1 && dqMin[dqMin.size() - 1].f < dqMin[dqMin.size() - 2].f; dqMin.pop_back())
				swap(dqMin[dqMin.size() - 1], dqMin[dqMin.size() - 2]);
			if (dqMin[stDqMin].s < i + 1 - lungX)
				stDqMin++;

			if (i < lungX)
				continue;

			if (rez > dqMax[stDqMax].f - dqMin[stDqMin].f)
			{
				rez = dqMax[stDqMax].f - dqMin[stDqMin].f;
				nrSol = 0;
			}
			if (rez == dqMax[stDqMax].f - dqMin[stDqMin].f)
				nrSol++;
		}
	}
}

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

	for (int i = 2; i < MAX; i++)
		lg[i] = lg[i / 2] + 1;

	scanf("%d %d %d", &n, &m, &p);

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

	preCalc();

	for (; p; p--)
	{
		short DX, DY;
		scanf("%d %d\n", &DX, &DY);

		rez = LONG_MAX, nrSol = 0;
		check(DX, DY);
		if (DX != DY)
			check(DY, DX);

		printf("%d %d\n", rez, nrSol);
	}

	fclose(stdin);
	fclose(stdout);
	return 0;
}