Cod sursa(job #63594)

Utilizator Binary_FireFlorin Pg Binary_Fire Data 29 mai 2007 19:01:45
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.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];
int dq1[Nmax][2][Nmax],dql1[2][Nmax],p1[2][Nmax];	//min	0 - prim 1 - varf
int dq2[Nmax][2][Nmax],dql2[2][Nmax],p2[2][Nmax];	//max
int pr1,vf1,pr2,vf2;

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

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

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

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

	++vf;

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

}

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

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

	++vf;

	deq[vf]=val; deq[vf]=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,min,max,dif;

	init1(pr1,vf1,dql1[0][1],dql1[1][1]);
	init2(pr2,vf2,dql2[0][1],dql2[1][1]);

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

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


		el(dq1[j][0],p1[j][0],p1[j][1],Y,i);
		el(dq2[j][1],p2[j][0],p2[j][1],Y,i);

		el(dql1[0],pr1,vf1,X,j);
		el(dql2[1],pr2,vf2,X,j);

		ins1(dq1[j][0],p1[j][0],p1[j][1],map[i][j],i);
		ins2(dq2[j][1],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

		ins1(dql1[0],pr1,vf1,min,j);
		ins2(dql2[1],pr2,vf2,max,j);

		dif=dql2[0][pr2]-dql1[0][pr1];

		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);
	
  int poz=0;	
  unsigned max, sol = 0;
  #define dim 10000
  char buf[dim];
  fread(buf,1,dim,stdin);
  #define cit(x)                         \
  {                                      \
   x = 0;                                \
   while(buf[poz] < '0')                 \
    {                                    \
     ++poz;                              \
     if(poz == dim)                      \
       fread(buf,1,dim,stdin), poz = 0;  \
    }                                    \
   while(buf[poz] >= '0')                \
    {                                    \
     x = x*10 + buf[poz] - '0';          \
     if(++poz == dim)                    \
      fread(buf,1,dim,stdin), poz = 0;   \
    }                                    \
  }
	
	
	//scanf("%d%d%d",&N,&M,&P);
	cit(N) cit(M) cit(P) 

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

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

	return 0;
}