Cod sursa(job #434706)

Utilizator AndreyPAndrei Poenaru AndreyP Data 6 aprilie 2010 14:14:13
Problema Struti Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define fs first
#define sc second
#define mp make_pair
#define pss pair<short,short>
#define N 1024
short m,n,p;
short a[N][N];
short dmin[N][N];
short dmax[N][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;
		}
	}
}
inline 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 i=1; i<dx; ++i)
	{
		for(int j=1; j<=n; ++j)
		{
			x=a[i][j];
			while(dmin[j][0]>=pmin[j] && a[dmin[j][dmin[j][0]]][j]>=x)
				--dmin[j][0];
			dmin[j][++dmin[j][0]]=i;

			while(dmax[j][0]>=pmax[j] && a[dmax[j][dmax[j][0]]][j]<=x)
				--dmax[j][0];
			dmax[j][++dmax[j][0]]=i;
		}
	}

	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]>=pmin[j] && i-dmin[j][pmin[j]]==dx)
				++pmin[j];
			while(dmin[j][0]>=pmin[j] && a[dmin[j][dmin[j][0]]][j]>=x)
				--dmin[j][0];
			dmin[j][++dmin[j][0]]=i;

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

			x=a[dmin[j][pmin[j]]][j];
			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=a[dmax[j][pmax[j]]][j];
			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]=dmax[j][0]=0;
		}
		vezi(x,y);
		if(x!=y)
		{
			for(short j=1; j<=n; ++j)
			{
				pmin[j]=pmax[j]=1;
				dmin[j][0]=dmax[j][0]=0;
			}  
			vezi(y,x);
		}
		printf("%hd %d\n",rez1,rez2);
	}

	return 0;
}