Cod sursa(job #259952)

Utilizator alexeiIacob Radu alexei Data 16 februarie 2009 10:12:43
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 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];
int N, M, P;
int Dif, Nr;

struct deck
{
    int val, poz;
} ;

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

    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= M; ++j)
            scanf("%d",A[i] + j);
}

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

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

            deck X; X.val = A[i][j], X.poz = i;
            Q1.push_back(X);
            Q2.push_back(X);

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

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

            deck X1; X1.val = Max[i][j], X1.poz = j;
            deck X2; X2.val = Min[i][j], X2.poz = j;
            Q3.push_back(X1);
            Q4.push_back(X2);

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

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

    citire();

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

        Dif = INF, Nr = 0;

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

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