Cod sursa(job #1753548)

Utilizator antracodRadu Teodor antracod Data 6 septembrie 2016 17:46:40
Problema Struti Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
#include <iostream>
#include <fstream>
#include <deque>

using namespace std;

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

deque<int> DQmin,DQmax;

int MMIN[1002][1002],MMAX[1002][1002];
int a[1002][1002];
int n,m;
int sol,nrsol;

void genssm(int DX,int DY)
{
    for(int i=1; i<=n; i++)
    {
        DQmin.clear();
        DQmax.clear();
        for(int j=1; j<=m; j++)
        {
            while(DQmin.empty()==0 && DQmin.front()<=j-DY)
                DQmin.pop_front();
            while(DQmin.empty()==0 && a[i][DQmin.back()]>=a[i][j])
                DQmin.pop_back();
            DQmin.push_back(j);
            if(j>=DY)
                MMIN[i][j]=a[i][DQmin.front()];

            while(DQmax.empty()==0 && DQmax.front()<=j-DY)
                DQmax.pop_front();
            while(DQmax.empty()==0 && a[i][DQmax.back()]<=a[i][j])
                DQmax.pop_back();
            DQmax.push_back(j);
            if(j>=DY)
                MMAX[i][j]=a[i][DQmax.front()];
        }
    }
}

void ssmcol(int DX,int DY)
{
    for(int j=1; j<=m; j++)
    {
        DQmin.clear();
        DQmax.clear();
        for(int i=1; i<=n; i++)
        {
            while(DQmin.empty()==0 && DQmin.front()<=i-DX)
                DQmin.pop_front();
            while(DQmin.empty()==0 && MMIN[DQmin.back()][j]>=MMIN[i][j])
                DQmin.pop_back();
            DQmin.push_back(i);

            while(DQmax.empty()==0 && DQmax.front()<=i-DX)
                DQmax.pop_front();
            while(DQmax.empty()==0 && MMAX[DQmax.back()][j]<=MMAX[i][j])
                DQmax.pop_back();
            DQmax.push_back(i);

            if(i>=DX && j>=DY)
            {
                int dif=MMAX[DQmax.front()][j]-MMIN[DQmin.front()][j];
                cout<<dif<<" ";
                if(sol>dif)
                {
                    sol=dif;
                    nrsol=1;

                }
                else if(sol==dif)
                    {
                        nrsol++;
                    }
            }
        }
    }
}

void solve(int DX,int DY)
{
    genssm(DX,DY);
    ssmcol(DX,DY);
}

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

    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            in>>a[i][j];
        }
    }
    for(int i=1; i<=p; i++)
    {
        int DX,DY;
        in>>DX>>DY;
        sol=999999;
        solve(DX,DY);
        cout<<'\n';
        if(DX!=DY)
            solve(DY,DX);
        out<<sol<<" "<<nrsol<<'\n';
    }

}