Cod sursa(job #259957)

Utilizator alexeiIacob Radu alexei Data 16 februarie 2009 10:20:06
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.6 kb
#include <cstdio>
#include <deque>

using namespace std;

#define MAX_N 1005
#define INF 8005

int A[MAX_N][MAX_N], Max[MAX_N][MAX_N], Min[MAX_N][MAX_N];char sir[10000];
int N, M, P;
int Dif, Nr;

/*
struct deck
{
    int first, poz;
};*/

void citire()
{
    scanf("%d %d %d\n",&N, &M, &P);

	int i,j,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;
	}
}

void search(int Dx, int Dy)
{
    deque < pair<int,int> > Q1, Q2, Q3, Q4;
	int i,j;
    for(j = 1; j <= M; ++j)
    {
        Q1.clear();
        Q2.clear();
        for(i = 1; i <= N; ++i)
        {
            while(!Q1.empty() && Q1.back().first <= A[i][j]) Q1.pop_back();
            while(!Q2.empty() && Q2.back().first >= A[i][j]) Q2.pop_back();

            while(!Q1.empty() && Q1.front().second <= i - Dx) Q1.pop_front();
            while(!Q2.empty() && Q2.front().second <= i - Dx) Q2.pop_front();

            //deck X; X.first = A[i][j], X.second = i;
            Q1.push_back(make_pair(A[i][j],i));
            Q2.push_back(make_pair(A[i][j],i));

            if(i >= Dx)
                Max[i][j] = Q1.front().first,
                Min[i][j] = Q2.front().first;
        }
    }
    
    for(i = Dx; i <= N; ++i)
    {
        Q3.clear();
        Q4.clear();
        for(j = 1; j <= M; ++j)
        {
            while(!Q3.empty() && Q3.back().first <= Max[i][j]) Q3.pop_back();
            while(!Q4.empty() && Q4.back().first >= Min[i][j]) Q4.pop_back();

            while(!Q3.empty() && Q3.front().second <= j - Dy) Q3.pop_front();
            while(!Q4.empty() && Q4.front().second <= j - Dy) Q4.pop_front();

            //deck X1; X1.first = Max[i][j], X1.second = j;
            //deck X2; X2.first = Min[i][j], X2.second = j;
            Q3.push_back(make_pair(Max[i][j],j));
            Q4.push_back(make_pair(Min[i][j],j));

            if(j >= Dy)
                if(Q3.front().first - Q4.front().first < Dif)
                    Dif = Q3.front().first - Q4.front().first,
                    Nr = 1;
                else if(Q3.front().first - Q4.front().first == Dif)
                    ++Nr;
        }
    }
}

int main()
{
    freopen("struti.in","rt",stdin);
    freopen("struti.out","wt",stdout);

    citire();

    while(P--)
    {
        int x, y;
        scanf("%d%d\n",&x, &y);

        Dif = INF, Nr = 0;

        search(x, y);
        if(x != y)
            search(y, x);

        printf("%d %d\n", Dif, Nr);
    }
}