Cod sursa(job #358159)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 21 octombrie 2009 23:49:10
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include<stdio.h>
int n,m,min,nr;
short int v[1<<10][1<<10],v1[1<<10][1<<10],v2[1<<10][1<<10],deq[1<<10],deq2[1<<10];

void rez(int dx, int dy)
{
	int p=1,u=0,i,j,p2=1,u2=0,a,b;
	for(i=1;i<=n;i++)
	{
		p=1;u=0;
		for(j=1;j<=m;j++)
		{
			while(p<=u && v[i][j]<v[i][deq[u]])
				u--;
			deq[++u]=j;
			if(deq[p]+dx<=j)
				p++;
			v1[i][j]=v[i][deq[p]];
		}
		p=1;u=0;
		for(j=1;j<=m;j++)
		{
			while(p<=u && v[i][j]>v[i][deq[u]])
				u--;
			deq[++u]=j;
			if(deq[p]+dx<=j)
				p++;
			v2[i][j]=v[i][deq[p]];
		}
	}
	for(i=dx;i<=m;i++)
	{
		p=1;u=0;
		p2=1;u2=0;
		for(j=1;j<dy;j++)
		{
			while(p<=u && v1[i][j]<v1[j][deq[u]])
				u--;
			deq[++u]=i;
			if(deq[p]+dy<=i)
				p++;
			while(p2<=u2 && v2[i][j]>v2[j][deq2[u2]])
				u2--;
			deq2[++u2]=i;
			if(deq2[p2]+dy<=i)
				p2++;
		}
		for(j=dy;j<=n;j++)
		{
			while(p<=u && v1[i][j]<v1[j][deq[u]])
				u--;
			deq[++u]=i;
			if(deq[p]+dy<=i)
				p++;
			while(p2<=u2 && v2[i][j]>v2[j][deq[u]])
				u2--;
			deq2[++u2]=i;
			if(deq2[p2]+dy<=i)
				p2++;
			a=v1[deq[p]][j];b=v2[deq2[p2]][j];
			if(b-a<min)
				min=b-a,nr=1;
			else
				if(b-a==min)
					nr++;
		}
	}
}

int main()
{
	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);
	int k,dx,dy;
	short int x;
	char s[6000];
	scanf("%d%d%d\n",&n,&m,&k);
	int i,j,y;
	for(i=1;i<=n;i++)
	{
		gets(s+1);
		y=0;
		for(j=1;s[j];j++)
			if(s[j]==' ')
			{
				v[i][++y]=x;
				x=0;
			}
			else
				x=x*10+s[j]-'0';
		v[i][++y]=x;
		x=0;
	}
	while(k--)
	{
		scanf("%d%d",&dx,&dy);
		min=1<<30;nr=0;
		rez(dx,dy);
		if(dx-dy)
			rez(dy,dx);
		printf("%d %d\n",min,nr);
	}
	return 0;
}