Cod sursa(job #36595)

Utilizator m_dersidanDersidan Mihai m_dersidan Data 23 martie 2007 19:14:03
Problema Struti Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
# include <stdio.h>

# define  _fin  "struti.in"
# define  _fout "struti.out"

# define  maxn  1001


typedef struct deque
{
	int a[maxn], h, t;
}	deque;

int a[maxn][maxn], n, m, p,
	minl[maxn][maxn], minc[maxn][maxn],
	maxl[maxn][maxn], maxc[maxn][maxn];

void insmin(deque &d, int x)
{
	while ( d.t >= d.h && d.a[d.t]>x ) --d.t;
	d.a[++d.t] = x;
}
void insmax(deque &d, int x)
{
	while ( d.t >= d.h && d.a[d.t]<x ) --d.t;
	d.a[++d.t] = x;
}
void del(deque &d)
{
	if ( ++d.h > d.t ) d.h=1, d.t=0;
}
inline int head(deque d) { return d.a[d.h]; }
inline void init(deque &d) { d.h=1, d.t=0; }

void readf()
{
	freopen(_fin, "r", stdin);
	int i, j;
	for (scanf("%d%d%d", &n, &m, &p), i=1; i<=n; i++)
		for (j=1; j<=m; j++) scanf("%d", &a[i][j]);
}

deque l;
int dmin, cnt;

void solvet(int dx, int dy)
{
	int i, j;
	
	// aflu minimul
	// linii
	for (i=1; i<=n; i++)
	{
		init(l);
		for (j=1; j<=dx; j++) insmin(l, a[i][j]);
		minl[i][1] = head(l);
		for (; j<=m; j++)
		{
			if ( a[i][j-dx]==head(l) ) del(l);
			insmin(l, a[i][j]);

			minl[i][j-dx+1]=head(l);
		}
	}
	// coloane
	for (i=1; i<=m-dx+1; i++)
	{
		init(l);
		for (j=1; j<=dy; j++) insmin(l, minl[j][i]);
		minc[1][i] = head(l);
		for (; j<=n; j++)
		{
			if ( minl[j-dy][i]==head(l) ) del(l);
			insmin(l, minl[j][i]);

			minc[j-dy+1][i]=head(l);
		}
	}

	for (i=1; i<=n; i++)
	{
		init(l);
		for (j=1; j<=dx; j++) insmax(l, a[i][j]);
		maxl[i][1] = head(l);
		for (; j<=m; j++)
		{
			if ( a[i][j-dx]==head(l) ) del(l);
			insmax(l, a[i][j]);

			maxl[i][j-dx+1]=head(l);
		}
	}
	// coloane
	for (i=1; i<=m-dx+1; i++)
	{
		init(l);
		for (j=1; j<=dy; j++) insmax(l, maxl[j][i]);
		maxc[1][i] = head(l);
		for (; j<=n; j++)
		{
			if ( maxl[j-dy][i]==head(l) ) del(l);
			insmax(l, maxl[j][i]);

			maxc[j-dy+1][i]=head(l);
		}
	}

	for (i=1; i<=n-dy+1; i++)
		for (j=1; j<=m-dx+1; j++)
			if ( maxc[i][j]-minc[i][j] < dmin ) dmin=maxc[i][j]-minc[i][j], cnt=1;
			else if ( maxc[i][j]-minc[i][j]==dmin ) ++cnt;
}

int main()
{
	readf();
	freopen(_fout, "w", stdout);
	int i, dx, dy;
	
	for (i=1; i<=p; i++)
	{
		scanf("%d%d", &dx, &dy);
		dmin=27000, cnt=0;
		solvet(dx, dy);
		if ( dx != dy ) solvet(dy, dx);
		
		printf("%d %d\n", dmin, cnt);
	}
	
	return 0;
}