Cod sursa(job #341803)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 19 august 2009 16:19:21
Problema Struti Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.32 kb
#include<cstdio>
#define N 1001
short int n,m,a[N][N];
short int x,y,num,rez;
struct struti{short int min,max;}d[N][N],p[N],u[N],d2[N],p1,u1;
void dq1(int i,short int q,short int y,short int x)
{
	int f=1;
	if (u[i].min)
		f=d[i][u[i].min-1].min;
	for (int j=f; j<=q+y-1; ++j)
	{
		short int g=j-d[i][p[i].min].min;
		if (g==y) ++p[i].min;
		while (p[i].min<u[i].min&&a[i][j]<=a[i][d[i][u[i].min-1].min])
			--u[i].min;
		d[i][u[i].min++].min=j;
	}	
	f=1;
	if (u[i].max)
		f=d[i][u[i].max-1].max;
	for (int j=f; j<=q+y-1; ++j)
	{
		int g=j-d[i][p[i].max].max;
		if (g==y) ++p[i].max;
		while (p[i].max<u[i].max&&a[i][j]>=a[i][d[i][u[i].max-1].max])
			--u[i].max;
		d[i][u[i].max++].max=j;
	}
}
void dq2(short int j,short int x,short int n)
{
	p1.min=p1.max=u1.min=u1.max=0;
	for (int i=1; i<=x; ++i)
	{
		int um=1;
		if (u1.min!=p1.min)
			um=d2[u1.min-1].min;
		while (p1.min<u1.min&&a[i][d[i][p[i].min].min]<=a[um][d[um][p[um].min].min])
		{
			--u1.min;
			if (p1.min!=u1.min)
			um=d2[u1.min-1].min;
		}
		d2[u1.min++].min=i;
		um=1;
		if (u1.max!=p1.max)
			um=d2[u1.max-1].max;
		while (p1.max<u1.max&&a[i][d[i][p[i].max].max]>=a[um][d[um][p[um].max].max])
		{
			--u1.max;
			if (p1.max!=u1.max)
			um=d2[u1.max-1].max;
		}
		d2[u1.max++].max=i;
	}
	int i1=d2[p1.max].max,i2=d2[p1.min].min;
	if(rez>a[i1][d[i1][p[i1].max].max]-a[i2][d[i2][p[i2].min].min])
	{
		rez=a[i1][d[i1][p[i1].max].max]-a[i2][d[i2][p[i2].min].min];
		num=1;
	}
	else
		if(rez==a[i1][d[i1][p[i1].max].max]-a[i2][d[i2][p[i2].min].min])
			++num;

	for (int i=x+1; i<=n; ++i)
	{
		int g=i-d2[p1.min].min;
		if (g==x) ++p1.min;
		int um=1;
		if (u1.min!=p1.min)
			um=d2[u1.min-1].min;
		while (p1.min<u1.min&&a[i][d[i][p[i].min].min]<=a[um][d[um][p[um].min].min])
		{
			--u1.min;
			if (p1.min!=u1.min)
			um=d2[u1.min-1].min;
		}
		d2[u1.min++].min=i;
		g=i-d2[p1.max].max;
		if (g==x) ++p1.max;
		um=1;
		if (u1.max!=p1.max)
			um=d2[u1.max-1].max;
		while (p1.max<u1.max&&a[i][d[i][p[i].max].max]>=a[um][d[um][p[um].max].max])
		{
			--u1.max;
			if (p1.max!=u1.max)
			um=d2[u1.max-1].max;
		}
		
		d2[u1.max++].max=i;
		i1=d2[p1.max].max;
		i2=d2[p1.min].min;
		if(rez>a[i1][d[i1][p[i1].max].max]-a[i2][d[i2][p[i2].min].min])
		{
			rez=a[i1][d[i1][p[i1].max].max]-a[i2][d[i2][p[i2].min].min];
			num=1;
		}
		else
			if(rez==a[i1][d[i1][p[i1].max].max]-a[i2][d[i2][p[i2].min].min])
				++num;
	}
}
void curat()
{
	for (int i=1; i<=n; ++i)
	{
		int h;
		if (u[i].max>u[i].min) h=u[i].max; else h=u[i].min;
		for (int j=0; j<=h; ++j)
			d[i][j].min=d[i][j].max=0;
		u[i].max=u[i].min=p[i].max=p[i].min=0;
	}
}
inline void matrice()
{
	u[0].min=u[0].max=p[0].min=p[0].max=0;
	for (int j=1; j<=m-y+1; ++j)
	{
		for (int i=1; i<=n; ++i)
			dq1(i,j,y,x);
		dq2(j,x,n);
	}
	curat();
	if (x!=y)
	{
	for (int i=1; i<=n-x+1; ++i)
	{
		for (int j=1; j<=m; ++j)
			dq1(j,i,x,y);
		dq2(i,y,m);
	}
	curat();
	}
}
void citire()
{
	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);
	short int t;
	scanf("%hd%hd%hd",&n,&m,&t);
	for (int i=1; i<=n; ++i)
		for (int j=1; j<=m; ++j)
			scanf("%hd",&a[i][j]);
	while(t)
	{
		scanf("%hd%hd",&x,&y);
		num=0;
		rez=8001;
		matrice();
		printf("%d %d\n",rez,num);
		--t;
	}
}
int main()
{
	citire();
	return 0;
}