Cod sursa(job #358278)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 22 octombrie 2009 14:54:20
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<stdio.h>
int n,m,min,nr;
short int v[1002][1002],v1[1002][1002],v2[1002][1002],deq[1002],deq2[1002];

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(j=dx;j<=m;j++)
	{
		p=1;u=0;
		p2=1;u2=0;
		for(i=1;i<=n;i++)
		{
			while(p<=u && v1[i][j]<v1[deq[u]][j])
				u--;
			deq[++u]=i;
			if(deq[p]+dy<=i)
				p++;
			while(p2<=u2 && v2[i][j]>v2[deq2[u2]][j])
				u2--;
			deq2[++u2]=i;
			if(deq2[p2]+dy<=i)
				p2++;
			a=v1[deq[p]][j];b=v2[deq2[p2]][j];
			if(i>=dy)
				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;
}