Cod sursa(job #493514)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 18 octombrie 2010 17:17:59
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 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 Dm[DIM], DM[DIM];
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];
}

void rzl (int K1, int K2) {
	int i, j, pm, um, pM, uM;

	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 parc () {
	int K1, K2;
	for (int t=0; t<T; ++t) {
		f1 >> K1 >> K2;
		H = INF, C = 0;
		
		rzl (K1, K2);
		if (K1 != K2)
			rzl (K2, K1);
		
		f2 << H << ' ' << C << '\n'; 
	}	
}

int main () {

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