Cod sursa(job #1147375)

Utilizator Athena99Anghel Anca Athena99 Data 19 martie 2014 19:38:28
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 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, d[2][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> &dq, int t, int sign, int j, int value ) {
    while ( !dq.empty() && sign*v[d[t][dq.back()].front()][dq.back()]<sign*v[d[t][j].front()][j] ) {
        dq.pop_back();
    }
    dq.push_back(j);
 
    while ( !dq.empty() && dq.front()<=j-value ) {
        dq.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( d[0][j], 1, i, j, x ), update1( d[1][j], -1, i, j, x );
            update2( dm1, 0 , -1, j, y ), update2( dm2, 1 , 1, j, y );
 
            if ( x<=i && y<=j ) {
                int value = v[d[1][dm2.front()].front()][dm2.front()];
                value-= v[d[0][dm1.front()].front()][dm1.front()];
                if ( value==sol ) {
                    ++solnr;
                } else if ( value<sol ) {
                    sol= value, solnr= 1;
                }
            }
        }
    }
 
    for ( int i= 0; i<=nmax; d[0][i].clear(), d[1][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;
}