Cod sursa(job #464748)

Utilizator AndreyPAndrei Poenaru AndreyP Data 21 iunie 2010 16:38:28
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.98 kb
#include<cstdio>
#include<cstring>
#define N 1001
struct pss
{
	short fs,sc;
};
short m,n,p;
short a[1002][N];
pss dmin[1002][N];
pss dmax[1002][N];
short pmin[N],pmax[N];
short rez1;
int rez2;
inline void citire()
{
	scanf("%hd%hd%hd\n",&m,&n,&p);
        char c[6*N]={0};
	
	for(short i=1; i<=m; ++i)
	{
		fgets(c,6*N,stdin);
		short x,i1=0;
		for(short j=1; j<=n; ++j)
		{
			x=0;
                	for(; c[i1]>='0' && c[i1]<='9'; ++i1)
				x=x*10+(c[i1]-'0');
			++i1;
			a[i][j]=x;
		}
	}
}
void vezi(short dx,short dy)
{
	pss emin[N],emax[N];
	emin[0].fs=emax[0].fs=0;
	short qmin=1,qmax=1;
	short x,y;

        for(short j=1; j<=n; ++j)
	{
		x=a[1][j];
		dmin[j][0].fs=1;
		pmin[j]=1;
		dmin[j][1].fs=1;
		dmin[j][1].sc=x;

		dmax[j][0].fs=1;
		pmax[j]=1;
		dmax[j][1].fs=1;
		dmax[j][1].sc=x;
	}

        for(short i=2; i<dx; ++i)
	{
		for(int j=1; j<=n; ++j)
		{
			x=a[i][j];
			while(dmin[j][0].fs>0 && dmin[j][dmin[j][0].fs].sc>=x)
				--dmin[j][0].fs;
			dmin[j][++dmin[j][0].fs].fs=i;
			dmin[j][dmin[j][0].fs].sc=x;

			while(dmax[j][0].fs>0 && dmax[j][dmax[j][0].fs].sc<=x)
				--dmax[j][0].fs;
			dmax[j][++dmax[j][0].fs].fs=i;
			dmax[j][dmax[j][0].fs].sc=x;
		}
	}

	for(short i=dx; i<=m; ++i)
	{
		qmin=qmax=1;
		emin[0].fs=emax[0].fs=0;
        	for(short j=1; j<=n; ++j)
		{
			x=a[i][j];
			if(dmin[j][0].fs>=pmin[j] && i-dmin[j][pmin[j]].fs==dx)
				++pmin[j];
			while(dmin[j][0].fs>=pmin[j] && dmin[j][dmin[j][0].fs].sc>=x)
				--dmin[j][0].fs;
			dmin[j][++dmin[j][0].fs].fs=i;
			dmin[j][dmin[j][0].fs].sc=x;

			if(dmax[j][0].fs>=pmax[j] && i-dmax[j][pmax[j]].fs==dx)
				++pmax[j];
			while(dmax[j][0].fs>=pmax[j] && dmax[j][dmax[j][0].fs].sc<=x)
				--dmax[j][0].fs;
			dmax[j][++dmax[j][0].fs].fs=i;
			dmax[j][dmax[j][0].fs].sc=x;

			x=dmin[j][pmin[j]].sc;
			if(emin[0].fs>=qmin && j-emin[qmin].fs==dy)
				++qmin;
			while(emin[0].fs>=qmin && emin[emin[0].fs].sc>=x)
				--emin[0].fs;
			emin[++emin[0].fs].fs=j;
                        emin[emin[0].fs].sc=x;

			x=dmax[j][pmax[j]].sc;
			if(emax[0].fs>=qmax && j-emax[qmax].fs==dy)
				++qmax;
			while(emax[0].fs>=qmax && emax[emax[0].fs].sc<=x)
				--emax[0].fs;
			emax[++emax[0].fs].fs=j;
			emax[emax[0].fs].sc=x;

			if(j<dy)
				continue;

                        x=emin[qmin].sc;
			y=emax[qmax].sc;
			
			y-=x;
			if(y<rez1)
			{
				rez1=y;
				rez2=1;
			}
			else
			if(y==rez1)
				++rez2;
		}
	}
}
int main()
{
	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);

	citire();
	short x,y;
        for(short i=0; i<p; ++i)
	{
		rez1=20010;
		rez2=0;
                scanf("%hd%hd",&x,&y);
		/*for(short j=1; j<=n; ++j)
		{
			pmin[j]=pmax[j]=1;
			dmin[j][0].fs=dmax[j][0].fs=0;
		}*/
		vezi(x,y);
		if(x!=y)
		{
			/*for(short j=1; j<=n; ++j)
			{
				pmin[j]=pmax[j]=1;
				dmin[j][0].fs=dmax[j][0].fs=0;
			}*/  
			vezi(y,x);
		}
		printf("%hd %d\n",rez1,rez2);
	}

	return 0;
}