Cod sursa(job #286220)

Utilizator tvladTataranu Vlad tvlad Data 23 martie 2009 16:39:15
Problema Struti Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <cstdio>
#include <deque>
using namespace std;

const int N = 1000;
const int M = 1000;

int n,m,p;
int a[N][M];

void scan ( int dx, int dy, int &min, int &nr ) {
	min = 0x3f3f3f3f;
	nr = 0;
	deque<int> dmin[M],dmax[M], dlmin, dlmax;
	for (int i = 0; i < n; ++i) {
		dlmin.clear();
		dlmax.clear();
		for (int j = 0; j < m; ++j) {
			if (!dmin[j].empty() && dmin[j].front() == i-dx) dmin[j].pop_front();
			while (!dmin[j].empty() && a[dmin[j].back()][j] > a[i][j]) dmin[j].pop_back();
			dmin[j].push_back(i);

			if (!dmax[j].empty() && dmax[j].front() == i-dx) dmax[j].pop_front();
			while (!dmax[j].empty() && a[dmax[j].back()][j] < a[i][j]) dmax[j].pop_back();
			dmax[j].push_back(i);

			if (!dlmin.empty() && dlmin.front() == j-dy) dlmin.pop_front();
			while (!dlmin.empty() && a[dmin[dlmin.back()].front()][dlmin.back()] > a[dmin[j].front()][j]) dlmin.pop_back();
			dlmin.push_back(j);

			if (!dlmax.empty() && dlmax.front() == j-dy) dlmax.pop_front();
			while (!dlmax.empty() && a[dmax[dlmax.back()].front()][dlmax.back()] < a[dmax[j].front()][j]) dlmax.pop_back();
			dlmax.push_back(j);

			if (i >= dx-1 && j >= dy-1) {
				int r = a[dmax[dlmax.front()].front()][dlmax.front()] - a[dmin[dlmin.front()].front()][dlmin.front()];
				if (r < min) min = r, nr = 1; else
				if (r == min) ++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 k = 0, dx, dy; k < p; ++k) {
		scanf("%d %d",&dx,&dy);
		int min1,n1,min2,n2;
		scan(dx,dy,min1,n1);
		scan(dx,dy,min2,n2);
		if (min1 == min2 && dx != dy) n1 += n2; else
		if (min2 < min1) min1 = min2, n1 = n2;
		printf("%d %d\n",min1,n1);
	}
	return 0;
}