Cod sursa(job #358148)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 21 octombrie 2009 23:06:28
Problema Struti Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 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],v3[1<<10][1<<10],v4[1<<10][1<<10],deq1[1<<10],deq2[1<<10];

void rez(int dx, int dy)
{
	int p1=1,u1=0,i,j,p2=1,u2=0;
	for(i=1;i<=n;i++)
	{
		p1=1;u1=0;
		p2=1;u2=0;
		for(j=1;j<=m;j++)
		{
			while(p1<=u1 && v[i][j]<v[i][deq1[u1]])
				u1--;
			deq1[++u1]=j;
			if(deq1[p1]+dx<=j)
				p1++;
			v1[i][j]=v[i][deq1[p1]];

			while(p2<=u2 && v[i][j]>v[i][deq2[u2]])
				u2--;
			deq2[++u2]=j;
			if(deq2[p2]+dx<=j)
				p2++;
			v2[i][j]=v[i][deq2[p2]];
		}
	}
	for(j=dx;j<=m;j++)
	{
		p1=1;u1=0;
		p2=1;u2=0;
		for(i=1;i<=n;i++)
		{
			while(p1<=u1 && v1[i][j]<v1[deq1[u1]][j])
				u1--;
			deq1[++u1]=i;
			if(deq1[p1]+dy<=i)
				p1++;
			v3[i][j]=v1[deq1[p1]][j];

			while(p2<=u2 && v2[i][j]>v2[deq2[u2]][j])
				u2--;
			deq2[++u2]=i;
			if(deq2[p2]+dy<=i)
				p2++;
			v4[i][j]=v2[deq2[p2]][j];
		}
	}
	for(i=dy;i<=n;i++)
		for(j=dx;j<=m;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++;
}

void rez2(int dx, int dy)
{
	rez(dx,dy);
	if(dx!=dy)
	{
		int i,j;
		for(i=1;i<=m;++i)
			for(j=1;j<=n;++j)
				v1[i][j]=v[j][m-i+1];
		for(i=1;i<=m;i++)
			for(j=1;j<=n;j++)
				v[i][j]=v1[i][j];
		i=n;n=m;m=i;
		rez(dy,dx);
		i=n;n=m;m=i;
	}
}

int main()
{
	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);
	int k,dx,dy;
	scanf("%d%d%d",&n,&m,&k);
	int i,j;
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			scanf("%hd",&v[i][j]);
	while(k--)
	{
		scanf("%d%d",&dx,&dy);
		min=1<<13;nr=0;
		rez2(dx,dy);
		printf("%d %d\n",min,nr);
	}
	return 0;
}