Cod sursa(job #1156085)

Utilizator Athena99Anghel Anca Athena99 Data 27 martie 2014 13:31:06
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 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;

deque <int> dmin, dmax;

int v[nmax+1][nmax+1], d[2][nmax+1][nmax+1]; //0 min, 1 max
int n, m, sol, solnr;

string buffer;
string::iterator buffer_it;

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

void query( int x, int y ) {
    for ( int i= 1; i<=n; dmin.clear(), dmax.clear(), ++i ) {
        for ( int j= 1; j<=m; ++j ) {
            for ( ; !dmin.empty() && v[i][dmin.back()]>=v[i][j]; dmin.pop_back() ) ;
            for ( ; !dmin.empty() && dmin.front()<=j-y; dmin.pop_front() ) ;
            dmin.push_back( j );

            for ( ; !dmax.empty() && v[i][dmax.back()]<=v[i][j]; dmax.pop_back() ) ;
            for ( ; !dmax.empty() && dmax.front()<=j-y; dmax.pop_front() ) ;
            dmax.push_back( j );

            if ( j>=y ) {
                d[0][i][j]= v[i][dmin.front()], d[1][i][j]= v[i][dmax.front()];
            }
        }
    }

    for ( int i= y; i<=m; dmin.clear(), dmax.clear(), ++i ) {
        for ( int j= 1; j<=n; ++j ) {
            for ( ; !dmin.empty() && d[0][dmin.back()][i]>=d[0][j][i]; dmin.pop_back() ) ;
            for ( ; !dmin.empty() && dmin.front()<=j-x; dmin.pop_front() ) ;
            dmin.push_back( j );

            for ( ; !dmax.empty() && d[1][dmax.back()][i]<=d[1][j][i]; dmax.pop_back() ) ;
            for ( ; !dmax.empty() && dmax.front()<=j-x; dmax.pop_front() ) ;
            dmax.push_back( j );

            if ( j>=x ) {
                int value= d[1][dmax.front()][i]-d[0][dmin.front()][i];
                if ( value<sol ) {
                    sol= value, solnr= 1;
                } else if ( value==sol ) {
                    ++solnr;
                }
            }
        }
    }
}

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

    int p;
    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 i= 1, x, y; i<=p; ++i ) {
        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;
}