Cod sursa(job #1535316)

Utilizator alexmisto342Turdean Alexandru alexmisto342 Data 24 noiembrie 2015 16:59:12
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
#include <cstring>
#include <deque>
//#define x first
//#define y second
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int n,m,ld,ls,mini[1001][1001],rasp,i,j,x,y,z,d,v[1001][1001],maxi[1001][1001],k,a,ok,b,nr;
deque < int > d1,d2;

void go(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==rasp)
                    nr++;
                if(k<rasp)
                {
                    rasp=k;
                    nr=1;
                }
            }
        }
        d1.clear();
        d2.clear();
    }
}

int main()
{
    fin>>n>>m>>b;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            fin>>v[i][j];
    for(a=1;a<=b;a++)
    {
        int x,y;
        fin>>x>>y;
        d1.clear();
        d2.clear();
        rasp=9999919919;
        go(x,y);
        if(x!=y)
            go(y,x);
        fout<<rasp<<" "<<nr<<'\n';
    }

return 0;
}