Cod sursa(job #1535264)

Utilizator DysKodeTurturica Razvan DysKode Data 24 noiembrie 2015 15:27:13
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.05 kb
#include <fstream>
#include <deque>
#include <iostream>

using namespace std;

#define f first
#define s second

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

int v[1010][1010],i,j,n,m,p,k[1010][1010],K[1010][1010],s,mini,maxi,ans,num,x,y,pr,o;
deque < int > d,D;
pair<int,int> a,b;

void solve( int x, int y )
{
    for( i = 1 ; i <= n ; i++ )
    {
        while( d.size() )
            d.pop_back();
        while( D.size() )
            D.pop_back();
        for( j = 1 ; j < y ; j++ )
        {
            while( d.size() && v[ i ][ d.back() ] > v[ i ][ j ] )
                d.pop_back();
            d.push_back( j );

            while( D.size() && v[ i ][ D.back() ] < v[ i ][ j ] )
                D.pop_back();
            D.push_back( j );
        }

        for( j = y ; j <= m ; j++ )
        {
            while( d.size() && v[ i ][ d.back() ] > v[ i ][ j ] )
                d.pop_back();
            d.push_back( j );

            while( D.size() && v[ i ][ D.back() ] < v[ i ][ j ] )
                D.pop_back();
            D.push_back( j );

            if( d.front() < j - y + 1 )
                d.pop_front();
            if( D.front() < j - y + 1 )
                D.pop_front();

            k[ i ][ j - y + 1 ] = v[ i ][ d.front() ];
            K[ i ][ j - y + 1 ] = v[ i ][ D.front() ];

        }
    }

    for( j = 1 ; j <= m - y + 1 ; j++ )
    {
        while( d.size() )
            d.pop_back();
        while( D.size() )
            D.pop_back();
        for( i = 1 ; i < x ; i++ )
        {
            while( d.size() && k[ d.back() ][ j ] > k[ i ][ j ] )
                d.pop_back();
            d.push_back( i );
            while( D.size() && K[ D.back() ][ j ] < K[ i ][ j ] )
                D.pop_back();
            D.push_back( i );
        }

        for( i = x ; i <= n ; i++ )
        {
            while( d.size() && k[ d.back() ][ j ] > k[ i ][ j ] )
                d.pop_back();
            d.push_back( i );
            while( D.size() && K[ D.back() ][ j ] < K[ i ][ j ] )
                D.pop_back();
            D.push_back( i );

            if( d.front() < i - x + 1 )
                d.pop_front();
            if( D.front() < i - x + 1 )
                D.pop_front();

            pr = K[ D.front() ][ j ] - k[ d.front() ][ j ];
            if( pr < ans )
            {
                ans = pr;
                num = 1;
            }
            else if( pr == ans )
            {
                num++;
            }
        }
    }

}

int main()
{
    fin>>n>>m>>p;

    for( i = 1 ; i <= n ; i++ )
    {
        for( j = 1 ; j <= m ; j++ )
        {
            fin>>v[ i ][ j ];
        }
    }

    for( o = 1 ; o <= p ; o++ )
    {
        fin>>x>>y;
        ans = 999999;
        num = 0;
        while( d.size() )
            d.pop_back();
        while( D.size() )
            D.pop_back();
        solve( x , y );
        if( x != y ) solve( y , x );
        fout<<ans<<' '<<num<<'\n';
    }

return 0;
}