Cod sursa(job #63742)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 30 mai 2007 19:32:11
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <stdio.h>
#define fin  "struti.in"
#define fout "struti.out"
#define Nmax 1001
#define INFI 8001

int N,M,X,Y,P,best,cnt,map[Nmax][Nmax];
int dq1[Nmax][Nmax][2],dql1[Nmax][2],p1[Nmax][2];	//min	0 - prim 1 - varf
int dq2[Nmax][Nmax][2],dql2[Nmax][2],p2[Nmax][2];	//max
int pr1,vf1,pr2,vf2;

void go(int X,int Y) {
int i,j,min,max,dif;

	for (i=1;i<=M;++i) {
		p1[i][0]=p1[i][1]=1; dq1[i][1][0]=INFI; dq1[i][1][1]=0;
		p2[i][0]=p2[i][1]=1; dq2[i][1][0]=-1; dq2[i][1][1]=0;
	}

	for (i=1;i<=N;++i)
	for (j=1;j<=M;++j) {
		
		if ( j==1 ) {
			pr1=vf1=1; dql1[1][0]=INFI; dql1[1][1]=0;
			pr2=vf2=1; dql2[1][0]=-1; dql2[1][1]=0;
		}

		if (dq1[j][p1[j][0]][1]<=i-Y)
		       ++p1[j][0];
		if (dq2[j][p2[j][0]][1]<=i-Y)
		       ++p2[j][0];

		if (dql1[pr1][1]<=j-X)
		       ++pr1;
		if (dql2[pr2][1]<=j-X)
		       ++pr2;

		while ( map[i][j] < dq1[j][p1[j][1]][0] && p1[j][1] >= p1[j][0] ) 
			--p1[j][1];
		++p1[j][1];
		dq1[j][p1[j][1]][0]=map[i][j]; dq1[j][p1[j][1]][1]=i;

		while ( map[i][j] > dq2[j][p2[j][1]][0] && p2[j][1] >= p2[j][0] ) 
			--p2[j][1];
		++p2[j][1];
		dq2[j][p2[j][1]][0]=map[i][j]; dq2[j][p2[j][1]][1]=i;

		min=dq1[j][p1[j][0]][0];	//imi iau minimul de pe coloana j
		max=dq2[j][p2[j][0]][0];	//si maximul

		while ( min < dql1[vf1][0] && vf1 >= pr1 ) 
			--vf1;
		++vf1;
		dql1[vf1][0]=min; dql1[vf1][1]=j;
		
		while ( max > dql2[pr2][0] && vf2 >= pr2 ) 
			--vf2;
		++vf2;
		dql2[vf2][0]=max; dql2[vf2][1]=j;
	
		dif=dql2[pr2][0]-dql1[pr1][0];
		
		if (j>=X && i>=Y) {
			if ( dif < best ) {
				best=dif;
				cnt=0;
			}
			if (dif==best)
				++cnt;
		}
	}	
		
}

int main() {
int i,j;

	freopen(fin,"r",stdin); freopen(fout,"w",stdout);
	
	scanf("%d%d%d",&N,&M,&P);

	for (i=1;i<=N;++i)
	for (j=1;j<=M;++j)
		scanf("%d",&map[i][j]);

	for (;P>0;--P) {
		scanf("%d%d",&X,&Y);
		best=INFI; cnt=0;
		
		go(X,Y);
		
		if (X!=Y) go(Y,X);
		
		printf("%d %d\n",best,cnt);
	}

	return 0;
}