Cod sursa(job #259942)

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

int A[NMAX][NMAX],M1[NMAX][NMAX],M2[NMAX][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;

	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;
	}

}

struct smen{
	int i1,i2;
};

void solve()
{
	int i,j;
	deque< smen >D1;
	deque< smen >D2;

	int aux;
	
    for( j = 1; j <= M; ++j)
    {
        D1.clear();
        D2.clear();
        for( i = 1; i <= N; ++i)
        {
            while(!D1.empty() && D1.back().i1 <= A[i][j]) D1.pop_back();
            while(!D2.empty() && D2.back().i1 >= A[i][j]) D2.pop_back();

            while(!D1.empty() && D1.front().i2 <= i - A1) D1.pop_front();
            while(!D2.empty() && D2.front().i2 <= i - A1) D2.pop_front();

            smen X; X.i1 = A[i][j], X.i2 = i;
            D1.push_back(X);
            D2.push_back(X);

            if(i >= A1)
                M1[i][j] = D1.front().i1,
                M2[i][j] = D2.front().i1;
        }
    }

	for( i = A1; i <= N; ++i)
    {
        D1.clear();
        D2.clear();
        for( j = 1; j <= M; ++j)
        {
			while(!D1.empty() && D1.back().i1 <= M1[i][j]) D1.pop_back();
			while(!D2.empty() && D2.back().i1 >= M2[i][j]) D2.pop_back();

			while(!D1.empty() && D1.front().i2 <= j - B) D1.pop_front();
			while(!D2.empty() && D2.front().i2 <= j - B) D2.pop_front();

            smen X1; X1.i1 = M1[i][j], X1.i2 = j;
            smen X2; X2.i1 = M2[i][j], X2.i2 = j;
            D1.push_back(X1);
            D2.push_back(X2);

            if(j >= B)
			{
				aux=D1.front().i1-D2.front().i1;

				if( ANS>aux )
				{
					ANS=aux;
					cnt=1;
				}
				else
					if( ANS==aux )
						++cnt;
			}
        }
    }
}		
	
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;
}