Cod sursa(job #238282)

Utilizator ProtomanAndrei Purice Protoman Data 1 ianuarie 2009 17:23:46
Problema Struti Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <stdio.h>
#include <algorithm>
#define mx 1024

using namespace std;

struct coord
{
	int x, y;
} dqmm[mx], dqmn[mx], cdqmm[mx][mx], cdqmn[mx][mx];
int cctmm[mx], cctmn[mx], cstmm[mx], cstmn[mx];
int n, m, p, soll, solc, x, y, stmm, stmn, ctmm, ctmn, lx, ly;
int alt[mx][mx];

bool cmm(int x, int y)
{
	return x > y;
}

bool cmn(int x, int y)
{
	return x < y;
}

void dqw(coord *dq, int& st, int& ct, bool (* cmp) (int i, int j))
{
	for (; ct > st && cmp(alt[dq[ct].x][dq[ct].y], alt[dq[ct - 1].x][dq[ct - 1].y]); ct--)
		swap(dq[ct], dq[ct - 1]);
	if (dq[st].x < dq[ct].x + 1 - lx || dq[st].y < dq[ct].y + 1 - ly)
		st++;
}

void cauta()
{
	memset(dqmm, 0, sizeof(dqmm));
	memset(dqmn, 0, sizeof(dqmn));
	memset(cdqmm, 0, sizeof(cdqmm));
	memset(cdqmn, 0, sizeof(cdqmn));
	memset(cctmm, 0, sizeof(cctmm));
	memset(cctmn, 0, sizeof(cctmn));
	for (int i = 1 ; i <= m; i++)
		cstmm[i] = cstmn[i] = 1;
	for (int i = 1; i <= n; i++)
	{
		memset(dqmm, 0, sizeof(dqmm));
		memset(dqmn, 0, sizeof(dqmn));
		ctmm = ctmn = 0;
		stmm = stmn = 1;
		for (int j = 1; j <= m; j++)
		{
			cdqmm[j][++cctmm[j]].x = cdqmn[j][++cctmn[j]].x = i;
			cdqmm[j][cctmm[j]].y = cdqmn[j][cctmn[j]].y = j;
			dqw(cdqmm[j], cstmm[j], cctmm[j], cmm);
			dqw(cdqmn[j], cstmn[j], cctmn[j], cmn);
			dqmm[++ctmm] = cdqmm[j][cstmm[j]];
			dqmn[++ctmn] = cdqmn[j][cstmn[j]];
			dqw(dqmm, stmm, ctmm, cmm);
			dqw(dqmn, stmn, ctmn, cmn);
			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;
		lx = x, ly = y;
		cauta();
		if (x != y)
			cauta();
		printf("%d %d\n", soll, solc);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}