Cod sursa(job #490012)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 4 octombrie 2010 17:40:24
Problema Struti Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <fstream>
using namespace std;
#define DIM 1<<10
#define OFE 11
#define INF (1<<31)-1

int A[DIM][DIM], MN[DIM][DIM], MX[DIM][DIM], MN1[DIM][DIM], MX1[DIM][DIM];
int Px[OFE], Py[OFE];
int P, U, D[DIM];
int M, N, T, DH, NR;

ifstream f1 ("struti.in");
ofstream f2 ("struti.out");

void cit () {
	int i, j;
	f1 >> M >> N >> T;
	for (i=1; i<=M; ++i)
		for (j=1; j<=N; ++j)
			f1 >> A[i][j];
	for (i=0; i<T; ++i)
		f1 >> Px[i] >> Py[i]; 
}

void init () {
	DH = INF;
	NR = 0;
}

void dmin (int K1, int K2) {
	int i, j;
	for (i=1; i<=M; ++i) {
		P = 1, U = 0;
		for (j=1; j<=N; ++j) {
			while (P<=U && A[i][D[U]]>=A[i][j]) --U;
			D[++U] = j;
			if (D[P]<=j-K1) ++P;
			MN1[i][j] = A[i][D[P]];
		}	
	}
	for (i=1; i<=N; ++i) {
		P = 1, U = 0;
		for (j=1; j<=M; ++j) {
			while (P<=U && MN1[D[U]][i]>=MN1[j][i]) --U;
			D[++U] = j;
			if (D[P]<=j-K2) ++P;
			MN[j][i] = MN1[D[P]][i];		
		}		
	}
}

void dmax (int K1, int K2) {
	int i, j;
	for (i=1; i<=M; ++i) {
		P = 1, U = 0;
		for (j=1; j<=N; ++j) {
			while (P<=U && A[i][D[U]]<=A[i][j]) --U;
			D[++U] = j;
			if (D[P]<=j-K1) ++P;
			MX1[i][j] = A[i][D[P]];
		}	
	}
	for (i=1; i<=N; ++i) {
		P = 1, U = 0;
		for (j=1; j<=M; ++j) {
			while (P<=U && MX1[D[U]][i]<=MX1[j][i]) --U;
			D[++U] = j;
			if (D[P]<=j-K2) ++P;
			MX[j][i] = MX1[D[P]][i];
		}	
	}	
}

void difh (int C1, int C2) {
	int i, j, h;
	for (i=C1; i<=M; ++i)
		for (j=C2; j<=N; ++j) {
			h = MX[i][j] - MN[i][j];
			if (DH > h)
				DH = h, NR = 1;
			else if (DH == h)
				++NR;
		}
}

void afs () {
	f2 << DH << ' ' << NR << '\n'; 
}

void parc () {
	for (int t=0; t<T; ++t) {
		init ();
		
		dmin (Px[t], Py[t]);
		dmax (Px[t], Py[t]);
		difh (Py[t], Px[t]);
		if (Px[t] != Py[t]) {
			dmin (Py[t], Px[t]);
			dmax (Py[t], Px[t]);
			difh (Px[t], Py[t]);
		}
		
		afs ();
	}	
}

int main () {

	cit ();
	parc ();
	
	f1.close ();
	f2.close ();
	
	return 0;
}