Cod sursa(job #252901)

Utilizator alexeiIacob Radu alexei Data 5 februarie 2009 00:50:10
Problema Struti Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.87 kb
#include<stdio.h>
#include<deque>
#define NMAX 1024
#define MOD 666013
using namespace std;
int N,M,T,A1,B,L,ANS,cnt;

short int A[NMAX][NMAX],M1[NMAX][NMAX],M2[NMAX][NMAX];
short int P1[NMAX],D1[NMAX];
short int P2[NMAX],D2[NMAX];
char sir[ 10000 ];
int i1,s1,i2,s2;

void reading()
{
	int i,j;
	scanf("%d%d%d\n",&N,&M,&T);

	int aux,it;char ch;

	for(i=1; i<=N; ++i)
	{
		fgets( sir, sizeof( sir ), stdin );

		aux=0;j=1;
		for(it=0; sir[ it ]!='\n' && sir[ it ]!=NULL; ++it )
		{
			if( sir[ it ]==' ' )
			{
				A[i][j]=aux; ++j; aux=0;  
			}
			else
			{
				aux*=10;
				aux+=sir[it]-'0';
			}
		}
		A[i][j]=aux;
	}

}

void put_D1( const int val,const int pos )
{
	if( !s1 || D1[i1]<=val )
		D1[i1=s1=1]=val,P1[i1]=pos;
	else
	{
		int it;
		for(it=i1+1; it<=s1; ++it)
			if( D1[ it ]<=val )
			{
				D1[ it ]=val,s1=it,P1[it]=pos;
				return;
			}

		D1[ ++s1 ]=val;P1[s1]=pos;
	}
}

void put_D2( const int val,const int pos )
{
	if( !s2 || D2[i2]>=val )
		D2[i2=s2=1]=val,P2[i2]=pos;
	else
	{
		int it;
		for(it=i2+1; it<=s2; ++it)
			if( D2[ it ]>=val )
			{
				D2[ it ]=val,s2=it,P2[it]=pos;
				return;
			}

		D2[ ++s2 ]=val;P2[s2]=pos;
	}
}

inline int find_max( const int pos )
{
	while( P1[ i1 ]<pos && i1<=s1 )
		++i1;

	return D1[i1];
}

inline int find_min( const int pos )
{
	while( P2[ i2 ]<pos && i2<=s2 )
		++i2;

	return D2[i2];
}

inline int min(const int a,const int b)
{
	return a<b?a:b;
}

void solve()
{
	int i,j,val;
 
	for(i=1; i<=N; ++i)
	{
		i1=s1=0;i2=s2=0;
		for(j=1; j<=B; ++j)
		{
			put_D1( A[i][j],j );
			put_D2( A[i][j],j );
		}
		
		M1[i][1]=D1[i1];
		M2[i][1]=D2[i2];

		for(j=2; j<=M-B+1; ++j)
		{
			put_D1( A[i][j+B-1], j+B-1 );
			put_D2( A[i][j+B-1], j+B-1 );
			
			M1[i][j]=find_max( j );
			M2[i][j]=find_min( j );
		}
	}
	/*
	for(i=1; i<=N; ++i)
	{
		for(j=1; j<=M; ++j)
			printf("%d ",M1[i][j]);
		printf("\n");
	}
	printf("\n");
	for(i=1; i<=N; ++i)
	{
		for(j=1; j<=M; ++j)
			printf("%d ",M2[i][j]);
		printf("\n");
	}
	printf("\n");*/

	for(j=1; j<=M-B+1; ++j)
	{
		i1=s1=0;i2=s2=0;
		for(i=1; i<=A1; ++i)
		{
			put_D1( M1[i][j],i );
			put_D2( M2[i][j],i );
		}
		
		val=D1[i1]-D2[i2];

		if( ANS>val )
			ANS=val,cnt=1;
		else
			if( ANS==val )
				++cnt;
		

		for(i=2; i<=N-A1+1; ++i)
		{
			put_D1( M1[i+A1-1][j], i+A1-1 );
			put_D2( M2[i+A1-1][j], i+A1-1 );
			
			val=find_max(i)-find_min(i);
			if( ANS>val )
			ANS=val,cnt=1;
			else
			if( ANS==val )
				++cnt;
		}
	}
	//printf("%d\n",ANS);

}
		

int main()
{
	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);
	
	reading();

	while( T-- )
	{
		scanf("%d%d\n",&A1,&B);
		ANS=0x3f3f3f3f;cnt=0;
		solve();
		if( A1!=B )
		{
			A1^=B;B^=A1;A1^=B;
			solve();
		}
		printf("%d %d\n",ANS,cnt);
	}

	return 0;
}