Cod sursa(job #64025)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 31 mai 2007 23:01:04
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 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],min[Nmax][Nmax],max[Nmax][Nmax];
int dq1[Nmax][2];	//min
int dq2[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) {

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

	++vf;

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

}

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

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

	++vf;

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

}

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,lo,hi;

	for (j=1;j<=M;++j) {
		init1(pr1,vf1,dq1[1][0],dq1[1][1]);
		init2(pr2,vf2,dq2[1][0],dq2[1][1]);
		for (i=1;i<=N;++i) { 
			el(dq1,pr1,vf1,Y,i);
			el(dq2,pr2,vf2,Y,i);
			
			ins1(dq1,pr1,vf1,min[i][j],i);
			ins2(dq2,pr2,vf2,max[i][j],i);

			min[i][j]=dq1[pr1][0];
			max[i][j]=dq2[pr2][0];
		}
	}
	
	for (i=Y;i<=N;++i) {
		init1(pr1,vf1,dq1[1][0],dq1[1][1]);
		init2(pr2,vf2,dq2[1][0],dq2[1][1]);
		for (j=1;j<=M;++j) {
			el(dq1,pr1,vf1,X,j);
			el(dq2,pr2,vf2,X,j);
			
			ins1(dq1,pr1,vf1,min[i][j],j);
			ins2(dq2,pr2,vf2,max[i][j],j);
			
			lo=dq1[pr1][0]; hi=dq2[pr2][0];

			if ( j>=X && hi - lo < best ) {
				best=hi-lo;
				cnt=0;
			}

			if ( j>=X && hi - lo == 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;
		
		for (i=1;i<=N;++i)
		for (j=1;j<=M;++j) 
			min[i][j]=max[i][j]=map[i][j];
		
		go(X,Y);
		
		if (X!=Y) {
			for (i=1;i<=N;++i)
			for (j=1;j<=M;++j) 
				min[i][j]=max[i][j]=map[i][j];
			go(Y,X);
		}

		printf("%d %d\n",best,cnt);
	}

	return 0;
}