Cod sursa(job #2202506)

Utilizator emiemiEmi Necula emiemi Data 8 mai 2018 22:10:28
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>
#include <deque>

using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");

#define NMAX 1005

int nr, n, m, p, mini, minM[NMAX][NMAX], maxM[NMAX][NMAX], a[NMAX][NMAX];
deque<pair<int, int> > q1, q2;

void solve(int dx, int dy) {
	int i, j;

	for (i = 1; i <= n; ++i) {
		q1.clear();
		q2.clear();

		for (j = 1; j <= m; ++j) {
			while (!q1.empty() && q1.back().first >= a[i][j])
				q1.pop_back();
			q1.push_back(make_pair(a[i][j], j));
			if (j - q1.front().second == dy)
				q1.pop_front();
			minM[i][j] = q1.front().first;

			while (!q2.empty() && q2.back().first <= a[i][j])
				q2.pop_back();
			q2.push_back(make_pair(a[i][j], j));
			if (j - q2.front().second == dy)
				q2.pop_front();
			maxM[i][j] = q2.front().first;
		}
	}

	for (j = dy; j <= m; ++j) {
		q1.clear();
		q2.clear();

		for (i = 1; i <= n; ++i) {
			while (!q1.empty() && q1.back().first >= minM[i][j])
				q1.pop_back();
			q1.push_back(make_pair(minM[i][j], i));
			if (i - q1.front().second == dx)
				q1.pop_front();

			while (!q2.empty() && q2.back().first <= maxM[i][j])
				q2.pop_back();
			q2.push_back(make_pair(maxM[i][j], i));
			if (i - q2.front().second == dx)
				q2.pop_front();

			int dif = q2.front().first - q1.front().first;
			if (i >= dx) {
				if (mini > dif) {
					mini = dif;
					nr = 1;
				} else if (mini == dif) {
					++nr;
				}
			}
		}
	}
}

int main() {
	int i, j, x, y;

	f >> n >> m >> p;

	for (i = 1; i <= n; ++i)
		for (j = 1; j <= m; ++j)
			f >> a[i][j];

	for (i = 1; i <= p; ++i) {
		f >> x >> y;

		mini = 100000;
		nr = 0;
		solve(x, y);
		if (x != y)
			solve(y, x);

		g << mini << ' ' << nr << '\n';
	}

	return 0;
}