Cod sursa(job #365660)

Utilizator bixcabc abc bixc Data 19 noiembrie 2009 16:04:12
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <stdio.h>
#include <string.h>
#define Nmax 1003
#define INF 8000010

int T[Nmax][Nmax], A[Nmax][Nmax], B[Nmax][Nmax], MIN[Nmax][Nmax], MAX[Nmax][Nmax];
int d[Nmax], D[Nmax];
int i, j, p, u, P, U, n, m, t, DX, DY, sol, Nsol, aux;

inline void dequeOriz(int L, int k) {
	
	p = 1, u = 0; P  = 1, U = 0;
	for (i = 1; i <= m; i++) {
		while (p <= u && T[L][i] <= T[L][d[u]]) u--;
		while (P <= U && T[L][i] >= T[L][D[U]]) U--;
		
		d[++u] = i, D[++U] = i;
		
		if (d[p] == i - k) p++;
		if (D[P] == i - k) P++;
		
		if (i >= k) {
			A[L][i] = T[L][d[p]];
			B[L][i] = T[L][D[P]];
		}
	}
}

inline void dequeVert(int C, int k) {
	
	p = 1, u = 0; P = 1, U = 0;
	for (i = 1; i <= n; i++) {
		while (p <= u && A[i][C] <= A[d[u]][C]) u--;
		while (P <= U && B[i][C] >= B[D[U]][C]) U--;
		
		d[++u] = i, D[++U] = i;
		
		if (d[p] == i - k) p++;
		if (D[P] == i - k) P++;
		
		if (i >= k) {
			MIN[i][C] = A[d[p]][C];
			MAX[i][C] = B[D[P]][C];
		}
	}
}

void solve() {

	int i, j;
	
	for (i = 1; i <= n; i++) {
		memset(d, 0, sizeof(d));
		memset(D, 0, sizeof(D));
		dequeOriz(i, DY);
	}
	for (j = 1; j <= m; j++) {
		memset(d, 0, sizeof(d));
		memset(D, 0, sizeof(D));
		dequeVert(j, DX);
	}

	

	for (i = DX; i <= n; i++)
		for (j = DY; j <= m; j++)
			if (MAX[i][j] - MIN[i][j] < sol) {
				sol = MAX[i][j] - MIN[i][j];
				Nsol = 1;
			}
			else
				if (MAX[i][j] - MIN[i][j] == sol)
					Nsol++;
}

int main() {
	
	FILE *f = fopen("struti.in", "r");
	FILE *g = fopen("struti.out", "w");
	
	fscanf(f, "%d %d %d", &n, &m, &t);
	for (i = 1; i <= n; i++)
		for (j = 1; j <= m; j++)
			fscanf(f, "%d", &T[i][j]);
	
	for (; t > 0; t--) {
		fscanf(f, "%d %d", &DX, &DY);
		
		sol = INF, Nsol = 0;
		solve();
		
		if (DX != DY) {
			aux = DX, DX = DY, DY = aux;
			solve();
		}
		
		fprintf(g, "%d %d\n", sol, Nsol);
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}