Cod sursa(job #365797)

Utilizator Addy.Adrian Draghici Addy. Data 19 noiembrie 2009 23:20:07
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <stdio.h>
#include <string.h>
#define Nmax 1003
#define INF 8000010

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

void solve() {
	//deque orizontala
	for (L = 1; L <= n; L++) {
		k = DY;
		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]];
			}
		}
	}
	
	//deque verticala
	for (C = DY; C <= m; C++) {
		k = DX;
		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 = A[d[p]][C];
				MAX = B[D[P]][C];
			}
			
			//caut sol in acelasi timp, nu parcurg separat pentru a economisi timp
			if (i >= DX) {
				if (MAX - MIN < sol) {
					sol = MAX - MIN;
					Nsol = 1;
				}
				else
					if (MAX - MIN == 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;
}