Cod sursa(job #358276)

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

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;
	}
	int p=1,u=0,p2=1,u2=0,a,b;
	while(k--)
	{
		scanf("%d%d",&dx,&dy);
		min=1<<30;nr=0;
		p=1,u=0,p2=1,u2=0;
		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]];
			}
		}
		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++;
				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++;
			}
		}
		if(dx!=dy)
		{
			i=dx;dx=dy;dy=i;
			p=1,u=0,p2=1,u2=0;
			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]];
				}
			}
			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++;
					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++;
				}
			}
		}
		printf("%d %d\n",min,nr);
	}
	return 0;
}