Cod sursa(job #1534225)

Utilizator DysKodeTurturica Razvan DysKode Data 23 noiembrie 2015 15:51:01
Problema Struti Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 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,s,mini,maxi,ans,num,x,y,pr,o;
deque < pair< int , int > > d,D;
pair<int,int> a,b;

void solve( int x, int y )
{
    for( o = x ; o <= n ; o++ )
    {
        while( d.size() )
            d.pop_back();
        while( D.size() )
            D.pop_back();

        for( j = 1 ; j < y ; j++ )
        {
            for( i = o - x + 1 ; i <= o ; i++ )
            {
                while( d.size() && v[ d.back().f ][ d.back().s ] > v[ i ][ j ] )
                {
                    d.pop_back();
                }
                d.push_back( make_pair( i , j ) );

                while( D.size() && v[ D.back().f ][ D.back().s ] < v[ i ][ j ] )
                {
                    D.pop_back();
                }
                D.push_back( make_pair( i , j ) );
            }
        }

        for( j = y ; j <= m ; j++ )
        {
            for( i = o - x + 1 ; i <= o ; i++ )
            {
                while( d.size() && v[ d.back().f ][ d.back().s ] > v[ i ][ j ] )
                {
                    d.pop_back();
                }
                d.push_back( make_pair( i , j ) );

                while( D.size() && v[ D.back().f ][ D.back().s ] < v[ i ][ j ] )
                {
                    D.pop_back();
                }
                D.push_back( make_pair( i , j ) );

                while( d.front().s < j - y + 1 )
                {
                    d.pop_front();
                }

                while( D.front().s < j - y + 1 )
                {
                    D.pop_front();
                }
            }

            pr = v[ D.front().f ][ D.front().s ] - v[ d.front().f ][ d.front().s ];


            if( pr < ans )
            {
                ans = pr;
                num = 1;
            }
            else if( pr == ans )
            {
                num++;
            }
            //cout<<x<<' '<<y<<' '<<pr<<' '<<ans<<' '<<num<<'\n'<<o-x + 1<<' '<<j-y+1<<' '<<o<<' '<<j<<"\n\n\n\n\n\n\n\n";
        }
    }
}

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

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

    for( k = 1 ; k <= p ; k++ )
    {
        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;
}