Cod sursa(job #494594)

Utilizator ConsstantinTabacu Raul Consstantin Data 22 octombrie 2010 10:41:03
Problema Struti Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include<stdio.h>
#include<string.h>

int mmax[1010 ][ 1010],mmin[1010][1010],Mmax[1010][1010],Mmin[1010][1010],i,j,dmin[ 1010 ],dmax[ 1010],pmin,umin,
	pmax,umax,k,l,m,n,a[1010][1010],dx,dy,nr,Dmin;
	
void solve(int dx,int dy){
int i,j;
pmin = pmax = 1;
umin = umax = 0;

for(i = 1 ; i <= n ; i++){
	pmin = pmax = 1;
	umin = umax = 0;
	for(j = 1 ; j <= m ; j++)
		{while(a[i][j] >  a[i][dmax[umax]] && umax >= pmax)
			umax--;
		umax++;
		dmax[umax] = j;
		while(dmax[pmax] <= j-dy)pmax++;
		
		while(a[i][j] <= a[i][dmin[umin] ]&& umin >= pmin)
			umin--;
		umin++;
		dmin[umin] = j;
		while(dmin[pmin] <= j-dy)pmin++;
		
		if(j>=dy){
			mmax[i][j] = a[i][dmax[pmax]];
			mmin[i][j] = a[i][dmin[pmin]];
			}
		}
	}

for(j = dy ; j <= m; j++)
	{pmax = pmin = 1;
	umax = umin = 0;
	for(i = 1 ; i <= n ; i++)
		{while(mmax[i][j] > mmax[dmax[umax]][j] && umax >= pmax)
			umax--;
		umax++;
		dmax[umax] = i;
		while(dmax[pmax] <= i-dx)pmax++;
		
		while(mmin[i][j] < mmin[dmin[umin]][j] && umin>= pmin)
			umin--;
		umin++;
		dmin[umin] = i;
		while(dmin[pmin]<=i-dx)pmin++;
		if(i >= dx){
			Mmax[i][j] = mmax[dmax[pmax]][j];
			Mmin[i][j] = mmin[dmin[pmin]][j];
			if(Mmax[i][j] - Mmin[i][j] < Dmin)
				{nr = 1;
				Dmin = Mmax[i][j] - Mmin[i][j];}
			else
			if(Mmax[i][j] - Mmin[i][j] == Dmin)
				nr++;
			}
		}
	}
		
}


void citire(){
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
int P,i,j;
scanf("%d %d %d",&n,&m,&P);

for(i = 1; i <= n ;i++)
	for(j=1;j<=m;j++)
		scanf("%d",&a[i][j]);
	
for(i = 1 ; i<= P; i++)
	{scanf("%d %d",&dx,&dy);
	Dmin = 1<<30;
	nr = 0;
	if(dx != dy){
	solve(dx,dy);
	solve(dy,dx);}
	else
		solve(dx,dy);
	printf("%d %d\n",Dmin,nr);
	}

}
int main(){
citire();
return 0;}