Cod sursa(job #36616)

Utilizator m_dersidanDersidan Mihai m_dersidan Data 23 martie 2007 19:25:09
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
# include <stdio.h>

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

# define  maxn  1001


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

int l[maxn], h, t;

void insmin(int x) { while ( t >= h && l[t]>x ) --t; l[++t] = x; }
void insmax(int x) { while ( t >= h && l[t]<x ) --t; l[++t] = x; }
inline void del() { if ( ++h > t ) h=1, t=0; }
inline int head() { return l[h]; }
inline void init() { h=1, 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]);
}

int dmin, cnt;

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

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

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

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

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

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

	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;
}