Cod sursa(job #1146502)

Utilizator Athena99Anghel Anca Athena99 Data 19 martie 2014 00:31:09
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <deque>
#include <fstream>
#include <string>

using namespace std;

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

const int nmax= 1000;
const int hmax= 8000;

int v[nmax+1][nmax+1];
int sol, solnr, n, m, p;
deque <int> dm1, dm2, d1[nmax+1], d2[nmax+1];
string buffer;
string::iterator buffer_it;

inline void read_int_nn( int &x ) {
    for ( ; *buffer_it<'0' || *buffer_it>'9'; ++buffer_it ) ;
    for ( x= 0; *buffer_it>='0' && *buffer_it<='9'; x= x*10+*buffer_it-'0', ++buffer_it ) ;
}

inline void update1( deque <int> &d, int sign, int i, int j, int value ) {
    while ( !d.empty() && sign*v[i][j]<sign*v[d.back()][j] ) {
        d.pop_back();
    }
    d.push_back(i);

    while ( !d.empty() && d.front()<=i-value ) {
        d.pop_front();
    }
}

inline void update2( deque <int> &d, deque <int> dp[], int sign, int j, int value ) {
    while ( !d.empty() && sign*v[dp[d.back()].front()][d.back()]<sign*v[dp[j].front()][j] ) {
        d.pop_back();
    }
    d.push_back(j);

    while ( !d.empty() && d.front()<=j-value ) {
        d.pop_front();
    }
}

void query( int x, int y ) {
    for ( int i= 1; i<=n; dm1.clear(), dm2.clear(), ++i ) {
        for ( int j= 1; j<=m; ++j ) {
            update1( d1[j], 1, i, j, x ), update1( d2[j], -1, i, j, x );
            update2( dm1, d1 , -1, j, y ), update2( dm2, d2 , 1, j, y );

            if ( x<=i && y<=j ) {
                int value = v[d2[dm2.front()].front()][dm2.front()];
                value-= v[d1[dm1.front()].front()][dm1.front()];
                if ( value==sol ) {
                    ++solnr;
                } else if ( value<sol ) {
                    sol= value, solnr= 1;
                }
            }
        }
    }

    for ( int i= 0; i<=nmax; d1[i].clear(), d2[i].clear(), ++i ) ;
}

int main(  ) {
    getline( fin, buffer, (char)0 );
    buffer_it= buffer.begin();

    read_int_nn(n), read_int_nn(m), read_int_nn(p);
    for ( int i= 1; i<=n; ++i ) {
        for ( int j= 1; j<=m; ++j ) {
            read_int_nn(v[i][j]);
        }
    }

    for ( int qr= 1; qr<=p; ++qr ) {
        int x, y;
        read_int_nn(x), read_int_nn(y);

        sol= hmax, solnr= 0;
        query( x, y );
        if ( x!=y ) {
            query( y, x );
        }
        fout<<sol<<" "<<solnr<<"\n";
    }

    return 0;
}