Cod sursa(job #358223)

Utilizator ProtomanAndrei Purice Protoman Data 22 octombrie 2009 11:56:01
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <algorithm>
#include <stdio.h>

#define MAX 1024
#include <algorithm>
#include <stdio.h>

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

using namespace std;

int n, m, p, minGs, sol;
int alt[MAX][MAX];
pair <int, int> matDif[MAX][MAX];
pair <int, int> deqMax[MAX], deqMin[MAX];

inline void test(int lx, int ly)
{
	for (int i = 1; i <= n; i++)
	{
		int deqMinSt = 1, deqMaxSt = 1;
		int deqMinFn = 0, deqMaxFn = 0;

		for (int j = 1; j <= m; j++)
		{
			deqMin[++deqMinFn] = deqMax[++deqMaxFn] = mp(alt[i][j], j);

			for (; deqMinSt != deqMinFn && deqMin[deqMinFn].f < deqMin[deqMinFn - 1].f; deqMinFn--)
				swap(deqMin[deqMinFn], deqMin[deqMinFn - 1]);
			if (deqMin[deqMinSt].s <= j - ly)
				deqMinSt++;

			for (; deqMaxSt != deqMaxFn && deqMax[deqMaxFn].f > deqMax[deqMaxFn - 1].f; deqMaxFn--)
				swap(deqMax[deqMaxFn], deqMax[deqMaxFn - 1]);
			if (deqMax[deqMaxSt].s <= j - ly)
				deqMaxSt++;

			matDif[i][j] = mp(deqMax[deqMaxSt].f, deqMin[deqMinSt].f);
		}
	}

	for (int j = ly; j <= m; j++)
	{
		int deqMinSt = 1, deqMaxSt = 1;
		int deqMinFn = 0, deqMaxFn = 0;

		for (int i = 1; i <= n; i++)
		{
			deqMax[++deqMaxFn] = mp(matDif[i][j].f, i);
			deqMin[++deqMinFn] = mp(matDif[i][j].s, i);

			for (; deqMinSt != deqMinFn && deqMin[deqMinFn].f < deqMin[deqMinFn - 1].f; deqMinFn--)
				swap(deqMin[deqMinFn], deqMin[deqMinFn - 1]);
			if (deqMin[deqMinSt].s <= i - lx)
				deqMinSt++;

			for (; deqMaxSt != deqMaxFn && deqMax[deqMaxFn].f > deqMax[deqMaxFn - 1].f; deqMaxFn--)
				swap(deqMax[deqMaxFn], deqMax[deqMaxFn - 1]);
			if (deqMax[deqMaxSt].s <= i - lx)
				deqMaxSt++;

			if (i >= lx)
			{
				if (deqMax[deqMaxSt].f - deqMin[deqMinSt].f < minGs)
					minGs = deqMax[deqMaxSt].f - deqMin[deqMinSt].f, sol = 0;
				if (deqMax[deqMaxSt].f - deqMin[deqMinSt].f == minGs)
					sol++;
			}
		}
	}
}

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--)
	{
		minGs = sol = LONG_MAX;
		int dx, dy;
		scanf("%d %d", &dx, &dy);

		test(dx, dy);

		if (dx != dy)
			test(dy, dx);

		printf("%d %d\n", minGs, sol);
	}

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