Cod sursa(job #1082153)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 14 ianuarie 2014 11:22:51
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <fstream>
#include <deque>


using namespace std;

const int MAX_N = 1010;
deque <int> maxL, maxC, minL, minC;
int N, M, P, ans, cnt, a[MAX_N][MAX_N], b[MAX_N][MAX_N], c[MAX_N][MAX_N], d[MAX_N][MAX_N], e[MAX_N][MAX_N];

void solve( int lung, int lat ){

    for( int i = 1; i <= N; ++i ){

        if( !maxL.empty() ) maxL.clear();
        if( !minL.empty() ) minL.clear();
        for( int j = 1; j <= M; ++j ){

            while( !maxL.empty() && a[i][j] >= a[i][maxL.back()] )
                maxL.pop_back();
            maxL.push_back( j );
            if( maxL.front() == j - lung ) maxL.pop_front();

            while( !minL.empty() && a[i][j] <= a[i][minL.back()] )
                minL.pop_back();
            minL.push_back( j );
            if( minL.front() == j - lung ) minL.pop_front();
            if( j >= lung ){

                    c[i][j] = a[i][minL.front()];
                    b[i][j] = a[i][maxL.front()];
                    }
            }
    }
    for( int j = lung; j <= M; ++j ){

        if( !maxC.empty() ) maxC.clear();
        if( !minC.empty() ) minC.clear();
        for( int i = 1; i <= N; ++i ){

            while( !maxC.empty() && b[i][j] >= b[maxC.back()][j] )
                maxC.pop_back();
            maxC.push_back( i );
            if( maxC.front() == i - lat ) maxC.pop_front();

            while( !minC.empty() && c[i][j] <= c[minC.back()][j] )
                minC.pop_back();
            minC.push_back( i );
            if( minC.front() == i - lat ) minC.pop_front();
            if( i >= lat ){

                    e[i][j] = c[minC.front()][j];
                    d[i][j] = b[maxC.front()][j];
                    }
            }
    }
    for( int i = lat; i <= N; ++i )
        for( int j = lung; j <= M; ++j )
            if( d[i][j] - e[i][j] < ans ){

                ans = d[i][j] - e[i][j];
                cnt = 1;
                }
                else if( d[i][j] - e[i][j] == ans ) ++cnt;
}

int main()
{
    ifstream cin( "struti.in" );
    ofstream cout( "struti.out" );

    cin >> N >> M >> P;
    for( int i = 1; i <= N; ++i )
        for( int j = 1; j <= M; ++j )
            cin >> a[i][j];
    for(; P >= 1; --P ){

        int x, y;
        cin >> x >> y;
        ans = 1e9;
        cnt = 0;
        if( x == y ) solve( x, y );
        else {

            solve( x, y );
            solve( y, x );
        }
        cout << ans << " " << cnt << "\n";
        }

    cin.close();
    cout.close();
    return 0;
}