Cod sursa(job #63988)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 31 mai 2007 21:08:29
Problema Struti Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <stdio.h>
#define fin  "struti.in"
#define fout "struti.out"
#define Nmax 1024
#define Mmax 400
#define INFI 8096

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

inline void el(int deq[Nmax][2],int &pr,int vf,int A,int p) {

	if ( deq[pr][1] <= p - A )
		++pr;
}

inline void ins1(int deq[Nmax][2],int pr,int &vf,int val,int poz) {

	#define W(q) if(pr + q <= vf && val < deq[pr + q][0]) vf = pr + q;
 
    W(8) else W(16) else W(16) else W(32)
    
    #undef W
    
    while ( val < deq[vf][0] && vf >= pr ) 
		
		--vf;

	++vf;

	deq[vf][1]=poz; deq[vf][0]=val; 

}

inline void ins2(int deq[Nmax][2],int pr,int &vf,int val,int poz) {

	#define W(q) if(pr + q <= vf && val > deq[pr + q][0]) vf = pr + q;
 
    W(8) else W(16) else W(16) else W(32)
    
    #undef W

	while ( val > deq[vf][0] && vf >= pr ) 
		
		--vf;

	++vf;

	deq[vf][1]=poz; deq[vf][0]=val; 

}

inline void init1(int &pr,int &vf,int &val,int &poz) {
	pr=1; vf=1;
	val=INFI; poz=0;
}

inline void init2(int &pr,int &vf,int &val,int &poz) {
	pr=1; vf=1;
	val=-1; poz=0;
}

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

	for (i=1;i<=M;++i) {
		init1(p1[i][0],p1[i][1],dq1[i][1][0],dq1[i][1][1]);
		init2(p2[i][0],p2[i][1],dq2[i][1][0],dq2[i][1][1]);
	}

	for (i=1;i<=N;++i)
	for (j=1;j<=M;++j) {
		
		if ( j==1 && i>=Y) {
			init1(pr1,vf1,dql1[1][0],dql1[1][1]);	
			init2(pr2,vf2,dql2[1][0],dql2[1][1]);
		}

		el(dq1[j],p1[j][0],p1[j][1],Y,i);
		el(dq2[j],p2[j][0],p2[j][1],Y,i);
		
		if (i>=Y) {
			el(dql1,pr1,vf1,X,j);
			el(dql2,pr2,vf2,X,j);
		}

		ins1(dq1[j],p1[j][0],p1[j][1],map[i][j],i);
		ins2(dq2[j],p2[j][0],p2[j][1],map[i][j],i);

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

		if (i>=Y) {
			ins1(dql1,pr1,vf1,min,j);
			ins2(dql2,pr2,vf2,max,j);
			dif=dql2[pr2][0]-dql1[pr1][0];
			if (j>=X) {
				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=M;j>0;--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;
}