Cod sursa(job #493507)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 18 octombrie 2010 17:11:46
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 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];
int Px[OFE], Py[OFE];
int M, N, T, H, h, C;

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 () {
	H = INF;
	C = 0;
}

void rzl (int K1, int K2) {
	int i, j, pm, um, pM, uM;
	int Dm[DIM], DM[DIM];

	for (i = 1; i <= M; ++i) {
		pm = pM = 1;
		um = uM = 0;
		for (j = 1; j <= N; ++j) {
			while (pm <= um && A[i][j] <= A[i][Dm[um]]) um--;
			while (pM <= uM && A[i][j] >= A[i][DM[uM]]) uM--;
			
			Dm[++um] = j;
			DM[++uM] = j;
			
			if (Dm[pm] <= j-K1) pm++;
			if (DM[pM] <= j-K1) pM++;
			
			MN[i][j] = A[i][Dm[pm]];
			MX[i][j] = A[i][DM[pM]];
		}		
	}
	
	for (j = K1; j <= N; ++j) {
		pm = pM = 1;
		um = uM = 0;
		for (i = 1; i <= M; ++i) {
			while (pm <= um && MN[i][j] <= MN[Dm[um]][j]) um--;
			while (pM <= uM && MX[i][j] >= MX[DM[uM]][j]) uM--;
			
			Dm[++um] = i;
			DM[++uM] = i;
			
			if (Dm[pm] <= i-K2) pm++;
			if (DM[pM] <= i-K2) pM++;
			
			if (i >= K2) {
				h = MX[DM[pM]][j] - MN[Dm[pm]][j];
				if (h < H) H = h, C = 1;
				else if (h == H) C++;				
			}
		}
	}	
}

void afs () {
	f2 << H << ' ' << C << '\n'; 
}

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

int main () {

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