Cod sursa(job #623052)

Utilizator lianaliana tucar liana Data 18 octombrie 2011 22:56:08
Problema Struti Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <stdio.h>
#define nmax 1005
struct element{long nr, poz;};
long n, m, p, i, j, r, inc, sf, ii, nl, nc, aux, rez, nrez;
long  ma[nmax][nmax], min[nmax][nmax], max[nmax][nmax], maxr[nmax][nmax], minr[nmax][nmax];
element co[nmax*nmax];

void citire()
{
	scanf("%ld %ld %ld",&n, &m, &p);
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
			scanf("%ld",&ma[i][j]);
}

bool rel(long a, long b)
{
	if (r==1)
		return (a>=b);
	return (a<=b);
}

void pecoloane()
{
	for (r=1;r<=2;r++)
		for (j=1;j<=m;j++)
		{
			co[1].nr=ma[1][j];	co[1].poz=1;
			inc=1;	sf=1;
			for (i=2;i<=n;i++)
			{
				if (co[inc].poz==i-nl)
					inc++;
				while ((rel(co[sf].nr,ma[i][j])) && (sf>=inc))
					sf--;
				co[++sf].nr=ma[i][j];	co[sf].poz=i;
				if (r==1)
					min[i][j]=co[inc].nr;
				else
					max[i][j]=co[inc].nr;
			}
		}
}

void rezolvare()
{
	for (r=1;r<=2;r++)
		for (i=nl;i<=n;i++)
		{
			if (r==1)
				co[1].nr=min[i][1];
			else
				co[1].nr=max[i][1];
			inc=1;	sf=1;	co[1].poz=1;	
			for (j=2;j<=m;j++)
			{
				if (co[inc].poz==j-nc)
					inc++;
				if (r==1)
				{
					while ((co[sf].nr>=min[i][j]) && (sf>=inc))
						sf--;
					co[++sf].nr=min[i][j];	co[sf].poz=j;
					minr[i][j]=co[inc].nr;
				}
				else
				{
					while ((co[sf].nr<=max[i][j]) && (sf>=inc))
						sf--;
					co[++sf].nr=max[i][j];	co[sf].poz=j;
					maxr[i][j]=co[inc].nr;
				}
			}
		}
	for (i=nl;i<=n;i++)	
		for (j=nc;j<=m;j++)
		{
			if (maxr[i][j]-minr[i][j]<rez)
			{	rez=maxr[i][j]-minr[i][j];	nrez=0;	}
			if (maxr[i][j]-minr[i][j]==rez)
				nrez++;
		}
}

int main()
{
	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);
	citire();
	for (ii=1;ii<=p;ii++)
	{
		scanf("%ld %ld",&nl,&nc);
		rez=8100;	nrez=0;
		pecoloane();	rezolvare();
		if (nl!=nc)
		{
			aux=nl;	nl=nc;	nc=aux;
			pecoloane();	rezolvare();
		}
		printf("%ld %ld\n",rez,nrez);
	}
	return 0;
}