Cod sursa(job #2732883)

Utilizator bostanlucastefanBostan Luca-Stefan bostanlucastefan Data 29 martie 2021 14:52:00
Problema Struti Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <fstream>
#include <utility>
#include <climits>
#include <deque>

using namespace std;

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

const int N=1e3+2;

int m,n,p,rez,nr,i,j;
int v[N][N],mx[N][N],mn[N][N];
deque<int> hmin,hmax;
pair<int,int> oferta;

void deque_col(pair<int,int> of)
{
    for(int j=1; j<=m; j++)
    {
        hmin.clear();
        hmax.clear();
        for(int i=1; i<=n; i++)
        {
            while(!hmax.empty() && v[i][j]>=v[hmax.back()][j])
                hmax.pop_back();
            while(!hmin.empty() && v[i][j]<=v[hmin.back()][j])
                hmin.pop_back();
            hmax.push_back(i);
            hmin.push_back(i);

            if(hmax.front()==i-of.first)
                hmax.pop_front();
            if(hmin.front()==i-of.first)
                hmin.pop_front();

            mx[i][j]=v[hmax.front()][j];
            mn[i][j]=v[hmin.front()][j];
        }
    }
}

void deque_lin(pair<int,int> of)
{
    for(int i=of.first; i<=n; i++)
    {
        hmin.clear();
        hmax.clear();
        for(int j=1; j<=m; j++)
        {
            while(!hmax.empty() && mx[i][j]>=mx[i][hmax.back()])
                hmax.pop_back();
            while(!hmin.empty() && mn[i][j]<=mn[i][hmin.back()])
                hmin.pop_back();
            hmax.push_back(j);
            hmin.push_back(j);

            if(hmax.front()==j-of.second)
                hmax.pop_front();
            if(hmin.front()==j-of.second)
                hmin.pop_front();

            if(j>=of.second && mx[i][hmax.front()]-mn[i][hmin.front()]<rez)
                rez=mx[i][hmax.front()]-mn[i][hmin.front()], nr=1;
            else if(j>=of.second && mx[i][hmax.front()]-mn[i][hmin.front()]==rez)
                nr++;
        }
    }
}

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

    for(i=1; i<=p; i++)
    {
        rez=INT_MAX, nr=0;
        fin>>oferta.first>>oferta.second;
        deque_col(oferta);
        deque_lin(oferta);

        if(oferta.first!=oferta.second)
        {
            swap(oferta.first,oferta.second);
            deque_col(oferta);
            deque_lin(oferta);
        }
        fout<<rez<<' '<<nr<<'\n';
    }
}