Cod sursa(job #1082212)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 14 ianuarie 2014 12:24:30
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.63 kb
#include <cstdio>
#include <cctype>

using namespace std;

const int Nmax = 1024;
const int Inf = 1 << 30;
const int BuffSize = 8192;

int mat[Nmax][Nmax], a[Nmax][Nmax], b[Nmax][Nmax];
int dq_min[Nmax], dq_max[Nmax];
int n, m, t, dx, dy, sol, nr_sol;

int pos = BuffSize;
char buff[BuffSize];

inline char getChar(FILE *f) {
	if (pos == BuffSize) {
		fread(buff, 1, BuffSize, f);
		pos = 0;
	}
	return buff[pos++];
}

inline int read(FILE *f) {
	int result = 0;
	char c;
	do {
		c = getChar(f);
	} while (!isdigit(c));

	do {
		result = 10 * result + c - '0';
		c = getChar(f);
	} while (isdigit(c));

	return result;
}

void solve() {

	int i, k, lin, col, f_dq_min, f_dq_max, l_dq_min, l_dq_max, max_val,
			min_val;

	for (lin = 1; lin <= n; lin++) {
		k = dy;
		f_dq_min = 1;
		l_dq_min = 0;
		f_dq_max = 1;
		l_dq_max = 0;
		for (i = 1; i <= m; i++) {
			while (f_dq_min <= l_dq_min
					and mat[lin][i] <= mat[lin][dq_min[l_dq_min]])
				l_dq_min--;
			while (f_dq_max <= l_dq_max
					and mat[lin][i] >= mat[lin][dq_max[l_dq_max]])
				l_dq_max--;

			dq_min[++l_dq_min] = i, dq_max[++l_dq_max] = i;

			if (dq_min[f_dq_min] == i - k)
				f_dq_min++;
			if (dq_max[f_dq_max] == i - k)
				f_dq_max++;

			if (i >= k) {
				a[lin][i] = mat[lin][dq_min[f_dq_min]];
				b[lin][i] = mat[lin][dq_max[f_dq_max]];
			}
		}
	}

	for (col = dy; col <= m; col++) {
		k = dx;
		f_dq_min = 1, l_dq_min = 0;
		f_dq_max = 1, l_dq_max = 0;
		for (i = 1; i <= n; i++) {
			while (f_dq_min <= l_dq_min
					and a[i][col] <= a[dq_min[l_dq_min]][col])
				l_dq_min--;
			while (f_dq_max <= l_dq_max
					and b[i][col] >= b[dq_max[l_dq_max]][col])
				l_dq_max--;

			dq_min[++l_dq_min] = i, dq_max[++l_dq_max] = i;

			if (dq_min[f_dq_min] == i - k)
				f_dq_min++;
			if (dq_max[f_dq_max] == i - k)
				f_dq_max++;

			if (i >= k) {
				min_val = a[dq_min[f_dq_min]][col];
				max_val = b[dq_max[f_dq_max]][col];
			}

			if (i >= dx) {
				if (max_val - min_val < sol) {
					sol = max_val - min_val;
					nr_sol = 1;
				} else if (max_val - min_val == sol)
					nr_sol++;
			}
		}
	}
}

int main() {

	FILE *f = fopen("struti.in", "r");
	FILE *g = fopen("struti.out", "w");

	int i, j, aux;

	n = read(f);
	m = read(f);
	t = read(f);

	for (i = 1; i <= n; i++)
		for (j = 1; j <= m; j++)
			mat[i][j] = read(f);

	while (t--) {
		dx = read(f);
		dy = read(f);

		sol = Inf, nr_sol = 0;
		solve();

		if (dx != dy) {
			aux = dx;
			dx = dy;
			dy = aux;
			solve();
		}

		fprintf(g, "%d %d\n", sol, nr_sol);
	}

	fclose(f);
	fclose(g);

	return 0;
}