Cod sursa(job #358269)

Utilizator tranbachhaiTran Bach Hai tranbachhai Data 22 octombrie 2009 14:34:00
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.41 kb
#include<stdio.h>
int x,y,m,n,xz;
long deque[1010],v[1010][1010],v1[1010][1010],v2[1010][1010],v3[1010][1010],v4[1010][1010];
int main()
{
int i,j,p,u;
long min,nr;
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%d%d%d",&m,&n,&xz);
for (i=1;i<=m;++i)
		for (j=1;j<=n;++j)
				scanf("%ld",&v[i][j]);
while(xz--)
{
	min=10000;
	nr=0;
	scanf("%d%d",&x,&y);
	for (j=1;j<=n;++j)
	{
		u=0;p=1;
		for (i=1;i<=m;++i)
		{
		while(p<=u && v[i][j]<v[deque[u]][j])
		u--;
		deque[++u]=i;
		while(deque[p]<=i-y)
		p++;
		v1[i][j]=v[deque[p]][j];
		}
	}
	for (j=1;j<=n;++j)
	{
	u=0;p=1;
	for (i=1;i<=m;++i)
	{
		while(p<=u && v[i][j]>v[deque[u]][j])
		u--;
		deque[++u]=i;
		while(deque[p]<=i-y)
		p++;
		v2[i][j]=v[deque[p]][j];
		}
	}
	for (i=1;i<=m;++i)
	{
		u=0;p=1;
		for (j=1;j<=n;++j)
		{
		while(p<=u && v1[i][j]<v1[i][deque[u]])
		u--;
		deque[++u]=j;
		while(deque[p]<=j-x)
		p++;
		v3[i][j]=v1[i][deque[p]];
		}
	}
	for (i=1;i<=m;++i)
	{
		u=0;p=1;
		for (j=1;j<=n;++j)
		{
		while(p<=u && v2[i][j]>v2[i][deque[u]])
		u--;
		deque[++u]=j;
		while(deque[p]<=j-x)
		p++;
		v4[i][j]=v2[i][deque[p]];
		}
	}
	for (i=y;i<=m;++i)
		for (j=x;j<=n;++j)
				if (v4[i][j]-v3[i][j]<min)
					{
					min=v4[i][j]-v3[i][j];
					nr=1;
					}
				else if (v4[i][j]-v3[i][j]==min)
					{
					++nr;
					}
	if (x!=y)
	{
	for (j=1;j<=n;++j)
	{
		u=0;p=1;
		for (i=1;i<=m;++i)
		{
		while(p<=u && v[i][j]<v[deque[u]][j])
		u--;
		deque[++u]=i;
		while(deque[p]<=i-x)
		p++;
		v1[i][j]=v[deque[p]][j];
		}
	}
	for (j=1;j<=n;++j)
	{
	u=0;p=1;
	for (i=1;i<=m;++i)
	{
		while(p<=u && v[i][j]>v[deque[u]][j])
		u--;
		deque[++u]=i;
		while(deque[p]<=i-x)
		p++;
		v2[i][j]=v[deque[p]][j];
		}
	}
	for (i=1;i<=m;++i)
	{
		u=0;p=1;
		for (j=1;j<=n;++j)
		{
		while(p<=u && v1[i][j]<v1[i][deque[u]])
		u--;
		deque[++u]=j;
		while(deque[p]<=j-y)
		p++;
		v3[i][j]=v1[i][deque[p]];
		}
	}
	for (i=1;i<=m;++i)
	{
		u=0;p=1;
		for (j=1;j<=n;++j)
		{
		while(p<=u && v2[i][j]>v2[i][deque[u]])
		u--;
		deque[++u]=j;
		while(deque[p]<=j-y)
		p++;
		v4[i][j]=v2[i][deque[p]];
		}
	}
	for (i=x;i<=m;++i)
			for (j=y;j<=n;++j)
					if (v4[i][j]-v3[i][j]<min)
					{
					min=v4[i][j]-v3[i][j];
					nr=1;
					}
					else if (v4[i][j]-v3[i][j]==min)
					{
					++nr;
					}
	}
	printf("%ld %ld\n",min,nr);
}
return 0;
}