Cod sursa(job #367393)

Utilizator iulia609fara nume iulia609 Data 22 noiembrie 2009 13:43:17
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include<stdio.h>
#define NMAX 1001
using namespace std;

typedef struct { int dif, nr; } pereche;
typedef struct { int val, poz; } dequeue_node;

dequeue_node Q[NMAX];

int N,M,P;
short int A[NMAX][NMAX], B[NMAX][NMAX], C[NMAX][NMAX];

void deq(int a, int b, int semn)
{
	int i, j, inceput, sfarsit;
	
	// fac dequeue pe coloane
	for (j = 1; j <= N; j++)
	{
		inceput = 1; sfarsit = 0;
		for (i = 1; i <= M; i++)
		{
			while (sfarsit >= inceput && A[i][j] * semn < Q[sfarsit].val * semn)
				sfarsit--;
			if (inceput <= sfarsit && Q[inceput].poz <= i-a)
				inceput++;
			sfarsit++; Q[sfarsit].val = A[i][j]; Q[sfarsit].poz = i;
			
			if (i >= a)
				B[i-a+1][j] = Q[inceput].val;
		}
	}
	
	// fac dequeue pe linii cu rezultatele de pe coloane
	for (i = 1; i <= M-a+1; i++)
	{
		inceput = 1; sfarsit = 0; // initializare dequeue
		for (j = 1; j <= N; j++)
		{
			while(sfarsit >= inceput && B[i][j] * semn < Q[sfarsit].val *semn)
				sfarsit--;
			if(inceput <= sfarsit && Q[inceput].poz <= j-b)
				inceput++;
			sfarsit++;
			Q[sfarsit].poz = j;
			Q[sfarsit].val = B[i][j];

			if(j >= b)
			{
				if (semn == +1)
					C[i][j-b+1] = Q[inceput].val;
				else if (semn == -1)
					C[i][j-b+1] = Q[inceput].val - C[i][j-b+1];
			}
		}
	}
}

pereche solve(int a, int b)
{ int i, j;
	// minim
	deq(a, b, +1);			
	
	// maxim
	deq(a, b, -1);

	pereche r;
	r.dif = 30000; r.nr = 0;
	for (i = 1; i <= M-a+1; i++)
		for (j = 1; j <= N-b+1; j++)
			if (C[i][j] < r.dif)
			{
				r.dif = C[i][j];
				if (C[i][j] == 0)
					printf("? %d %d\n", i, j);
				r.nr = 1;
			}
			else if (C[i][j] == r.dif)
				r.nr++;
	return r;
}

int main()
{ int i, j, a, b;
	
	
	freopen("struti.in", "r", stdin);
	freopen("struti.out", "w", stdout);
	
	scanf("%d %d %d", &M, &N, &P);
	
	for(i = 1; i <= M; i++)
		for(j = 1; j <= N; j++)
			scanf("%d", &A[i][j]);
		
	for(i = 1; i <= P; i++)
	{
		scanf("%d %d", &a, &b);
		
		pereche r = solve(a, b);
		if (a != b)
		{
			pereche r1 = solve(b, a);
			if (r1.dif < r.dif)
				r = r1;
			else if (r1.dif == r.dif)
				r.nr += r1.nr;
		}
		
		printf("%d %d\n", r.dif, r.nr);
	}
	
	return 0;
}