Cod sursa(job #1145257)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 18 martie 2014 00:07:24
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
#include<fstream>
#include<deque>

using namespace std;

ifstream fin( "struti.in" );
ofstream fout( "struti.out" );

const int nmax = 1000;
int n, m, sol, nr;
int a[ nmax + 1 ][ nmax + 1 ];

inline void solve( int dx, int dy ) {
    int dif_part;
    deque <int> dln, dlx;
    deque <int> dcn[ nmax + 1 ], dcx[ nmax + 1 ];

    for( int i = 0; i < n; ++ i ) {
        for( int j = 0; j < m; ++ j ) {
            while ( !dcn[ j ].empty() && a[ dcn[ j ].back() ][ j ] > a[i][j] ) {
                dcn[ j ].pop_back();
            }
            dcn[ j ].push_back( i );
            if ( dcn[ j ].front() <= i - dx ) {
                dcn[ j ].pop_front();
            }

            while ( !dcx[ j ].empty() && a[ dcx[ j ].back() ][ j ] < a[i][j] ) {
                dcx[ j ].pop_back();
            }
            dcx[ j ].push_back( i );
            if ( dcx[ j ].front() <= i - dx ) {
                dcx[ j ].pop_front();
            }
        }
        dln.clear();
        dlx.clear();
        for( int j = 0; j < m; ++ j ) {
            while ( !dln.empty() && a[ dcn[ dln.back() ].front() ][ dln.back() ] > a[ dcn[j].front() ][ j ] ) {
                dln.pop_back();
            }
            dln.push_back( j );
            if ( dln.front() <= j - dy ) {
                dln.pop_front();
            }

            while ( !dlx.empty() && a[ dcx[ dlx.back() ].front() ][ dlx.back() ] < a[ dcx[j].front() ][ j ] ) {
                dlx.pop_back();
            }
            dlx.push_back( j );
            if ( dlx.front() <= j - dy ) {
               dlx.pop_front();
            }

            if ( i >= dx - 1 && j >= dy - 1) {
                dif_part = a[ dcx[ dlx.front() ].front() ][ dlx.front() ] - a[ dcn[ dln.front() ].front() ][ dln.front() ];
                if ( dif_part < sol ) {
                    sol = dif_part;
                    nr = 0;
                } if ( sol == dif_part ) {
                    ++ nr;
                }
            }
        }
    }
}
int main()
{
    int t, dx, dy;
    fin>>n>>m>>t;
    for( int i = 0; i < n; ++ i ) {
        for( int j = 0; j < m; ++ j ) {
            fin>>a[i][j];
        }
    }
    for( int q = 0; q < t; ++ q ) {
        fin>>dx>>dy;
        sol = 1<<30;
        solve( dx, dy );
        if ( dx != dy ) {
            solve( dy, dx );
        }
        fout<<sol<<' '<<nr<<'\n';
    }
    fin.close();
    fout.close();
    return 0;
}