Cod sursa(job #1086305)

Utilizator vld7Campeanu Vlad vld7 Data 17 ianuarie 2014 22:47:06
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <fstream>
#include <iostream>

using namespace std;

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

const int MAX_N = 1005;

int n, m, p, A[MAX_N][MAX_N], B[MAX_N][MAX_N], deque[MAX_N][3], front, back;
int Maxim[MAX_N][MAX_N], Minim[MAX_N][MAX_N];
int ans, ansCount;

void read() {
	f >> n >> m >> p;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			f >> A[i][j];
}

void write (int B[][MAX_N], int x, int y) {
	for (int i = 1; i <= x; i++) {
		for (int j = 1; j <= y; j++)
			cerr << B[i][j] << " ";
		cerr << '\n';
	}
	
	cerr << "\n\n";
}

void solve (int dx, int dy) {
	for (int i = 1; i <= n; i++) {
		front = 1;	back = 0;
		for (int j = 1; j <= m; j++) {
			while (A[i][j] >= A[deque[back][0]][deque[back][1]] && front <= back)
				back--;
			++back;
			deque[back][0] = i;
			deque[back][1] = j;
			if (j - deque[front][1] >= dy)
				front++;
			if (j >= dy)
				B[i][j - dy + 1] = A[deque[front][0]][deque[front][1]];
		}
	}
	
	for (int j = 1; j <= m - dy + 1; j++) {
		front = 1;	back = 0;
		for (int i = 1; i <= n; i++) {
			while (B[i][j] >= B[deque[back][0]][deque[back][1]] && front <= back)
				back--;
			++back;
			deque[back][0] = i;
			deque[back][1] = j;
			if (i - deque[front][0] >= dx)
				front++;
			if (i >= dx)
				Maxim[i - dx + 1][j] = B[deque[front][0]][deque[front][1]];
		}
	}
	
	for (int i = 1; i <= n; i++) {
		front = 1;	back = 0;
		for (int j = 1; j <= m; j++) {
			while (A[i][j] <= A[deque[back][0]][deque[back][1]] && front <= back)
				back--;
			++back;
			deque[back][0] = i;
			deque[back][1] = j;
			if (j - deque[front][1] >= dy)
				front++;
			if (j >= dy)
				B[i][j - dy + 1] = A[deque[front][0]][deque[front][1]];
		}
	}
		
	for (int j = 1; j <= m - dy + 1; j++) {
		front = 1;	back = 0;
		for (int i = 1; i <= n; i++) {
			while (B[i][j] <= B[deque[back][0]][deque[back][1]] && front <= back)
				back--;
			++back;
			deque[back][0] = i;
			deque[back][1] = j;
			if (i - deque[front][0] >= dx)
				front++;
			if (i >= dx)
				Minim[i - dx + 1][j] = B[deque[front][0]][deque[front][1]];
		}
	}
	
	for (int i = 1; i <= n - dx + 1; i++)
		for (int j = 1; j <= m - dy + 1; j++)
			if (Maxim[i][j] - Minim[i][j] < ans) {
				ans = Maxim[i][j] - Minim[i][j];
				ansCount = 1;
			} else if (Maxim[i][j] - Minim[i][j] == ans)
				ansCount++;
}

int main() {
	read();
	while (p--) {
		ans = 100000000;	ansCount = 0;
		
		int dx, dy;
		f >> dx >> dy;
		solve (dx, dy);
		if (dx != dy)
			solve (dy, dx);
		g << ans << " " << ansCount << '\n';
	}
	
	return 0;
}