Cod sursa(job #286203)

Utilizator tvladTataranu Vlad tvlad Data 23 martie 2009 16:27:43
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <cstdio>
#include <queue>
using namespace std;

const int N_MAX = 1000;

int n,m,p;
int a[N_MAX][N_MAX], mx[N_MAX][N_MAX], mn[N_MAX][N_MAX];

pair<int,int> process ( int dx, int dy ) {
	deque<int> dq;
	for (int i = 0; i < n; ++i) {
		dq.clear();
		for (int j = 0; j < m; ++j) {
			if (j >= dy && dq.front() == a[i][j-dy]) dq.pop_front();
			for (; !dq.empty() && dq.back() < a[i][j]; dq.pop_back());
			dq.push_back(a[i][j]);
			mx[i][j] = dq.front();
		}
	}
	for (int j = 0; j < m; ++j) {
		dq.clear();
		for (int i = 0; i < n; ++i) {
			if (i >= dx && dq.front() == mx[i-dx][j]) dq.pop_front();
			for (; !dq.empty() && dq.back() < mx[i][j]; dq.pop_back());
			dq.push_back(mx[i][j]);
			mx[i][j] = dq.front();
		}
	}

	for (int i = 0; i < n; ++i) {
		dq.clear();
		for (int j = 0; j < m; ++j) {
			if (j >= dy && dq.front() == a[i][j-dy]) dq.pop_front();
			for (; !dq.empty() && dq.back() > a[i][j]; dq.pop_back());
			dq.push_back(a[i][j]);
			mn[i][j] = dq.front();
		}
	}
	for (int j = 0; j < m; ++j) {
		dq.clear();
		for (int i = 0; i < n; ++i) {
			if (i >= dx && dq.front() == mn[i-dx][j]) dq.pop_front();
			for (; !dq.empty() && dq.back() > mn[i][j]; dq.pop_back());
			dq.push_back(mn[i][j]);
			mn[i][j] = dq.front();
		}
	}

	int dif = 0x3f3f3f3f, nr = 0;
	for (int i = dx-1; i < n; ++i) {
		for (int j = dy-1; j < m; ++j) {
			if (dif > mx[i][j] - mn[i][j]) {
				dif = mx[i][j] - mn[i][j];
				nr = 1;
			} else
			if (dif == mx[i][j] - mn[i][j]) {
				++nr;
			}
		}
	}
	return make_pair(dif,nr);
}

int main() {
	freopen("struti.in","rt",stdin);
	freopen("struti.out","wt",stdout);
	scanf("%d %d %d",&n,&m,&p);
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < m; ++j)
			scanf("%d",&a[i][j]);
	for (int i = 0, dx,dy; i < p; ++i) {
		scanf("%d %d",&dx,&dy);
		pair<int,int> rez = process(dx,dy);
		if (dx != dy) {
			pair<int,int> rez2 = process(dx,dy);
			if (rez.first == rez2.first)
				rez.second += rez2.second; else
			if (rez.first < rez2.first)
				rez = rez2;
		}
		printf("%d %d\n",rez.first,rez.second);
	}
	return 0;
}