Cod sursa(job #1546603)

Utilizator raulmuresanRaul Muresan raulmuresan Data 8 decembrie 2015 13:11:01
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.51 kb
#include<fstream>
#include<deque>
#include<vector>
#include <cstring>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");



int n,m,k,i,j,p,x,y,v[1005][1005],t,sol,cont,mini[1005][1005],maxi[1005][1005];
deque <int> d1,d2;

void solve(int x,int y)
{
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            while( !d1.empty() && v[ i ] [ d1.back() ] < v[ i ] [ j ] )
                d1.pop_back();
            while( !d2.empty() && v[ i ] [ d2.back() ] > v[ i ] [ j ] )
                d2.pop_back();

            if( !d1.empty() && d1.front() < j-y+1 )
                d1.pop_front();
            if( !d2.empty() && d2.front() < j-y+1 )
                d2.pop_front();

            d1.push_back(j);
            d2.push_back(j);

            if(j>=y)
            {
                mini[i][j-y+1]=v[i][ d2.front() ];
                maxi[i][j-y+1]=v[i][ d1.front() ];
            }
        }
        d1.clear();
        d2.clear();
    }

    for(j=1;j<=m-y+1;j++)
    {
        for(i=1;i<=n;i++)
        {
            while( !d1.empty() && maxi[ d1.back() ][ j ] < maxi[ i ] [ j ] )
                d1.pop_back();
            while( !d2.empty() && mini[ d2.back() ][ j ] > mini[ i ] [ j ] )
                d2.pop_back();

            if( !d1.empty() && d1.front() < i-x+1 )
                d1.pop_front();
            if( !d2.empty() && d2.front() < i-x+1 )
                d2.pop_front();

            d1.push_back(i);
            d2.push_back(i);

            if(i>=x)
            {
                k=maxi[ d1.front() ][ j ] - mini[ d2.front() ][ j ];
                if(k==sol)
                    cont++;
                if(k<sol)
                {
                    sol=k;
                    cont=1;
                }
            }
        }
        d1.clear();
        d2.clear();
    }

    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
           // fout<<maxi[i][j]<<" ";
        }
        //fout<<"\n";
    }

    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            //fout<<mini[i][j]<<" ";
        }
        //fout<<"\n";
    }
}



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

    for(t=1;t<=p;t++)
    {
        fin>>x>>y;
        sol=2000000000;
        cont=0;
        solve(x,y);
        if(x!=y) solve(y,x);
        fout<<sol<<" "<<cont<<"\n";
    }


}