Cod sursa(job #2514523)

Utilizator Mirela_MagdalenaCatrina Mirela Mirela_Magdalena Data 26 decembrie 2019 12:23:13
Problema Struti Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.38 kb
#define NMAX 1005
#include <fstream>
#include <deque>
using namespace std;

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


int n, m, p, dx, dy, difmin, nr;
int mat[NMAX][NMAX];
int maxi[NMAX][NMAX], mini[NMAX][NMAX];
int finmax[NMAX][NMAX], finmin[NMAX][NMAX];

deque<int> deqMin, deqMax;


void add(deque<int>& mind, deque<int>& maxd, int min_to_add, int max_to_add)
{
    while(!mind.empty() && mind.back() > min_to_add)
        mind.pop_back();
    mind.push_back(min_to_add);

    while(!maxd.empty() && maxd.back() < max_to_add)
        maxd.pop_back();
    maxd.push_back(max_to_add);
}







void read_mat()
{
    f>>m>>n>>p;
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=m; ++j)
            f>>mat[i][j];
}



void solve(int dx, int dy)
{
    for(int i = 1; i<=n; ++i)
    {
        deqMin.clear();
        deqMax.clear();

        for(int j=1; j<=dy; ++j)
            add(deqMin, deqMax, mat[i][j], mat[i][j]);
        for(int j=dy; j<=m; ++j)
        {
            mini[i][j] = deqMin.front();
            maxi[i][j] = deqMax.front();
            if(deqMin.front() == mat[i][j - dy + 1])
                deqMin.pop_front();
            if(deqMax.front() == mat[i][j - dy + 1])
                deqMax.pop_front();
            add(deqMin, deqMax, mat[i][j+1], mat[i][j+1]);
        }
    }


    for(int j = dy; j <= m; ++j)
    {
        deqMin.clear();
        deqMax.clear();

        for(int i=1; i <= dx; ++i)
            add(deqMin, deqMax, mini[i][j], maxi[i][j]);
        for(int i = dx; i <= n; ++i)
        {
            int dif = deqMax.front() - deqMin.front();
            if(dif < difmin)
            {
                difmin = dif;
                nr = 1;
            }
            else if(dif == difmin)
                nr ++;


            if(deqMin.front() == mini[i-dx+1][j])
                deqMin.pop_front();
            if(deqMax.front() == maxi[i-dx+1][j])
                deqMax.pop_front();
            add(deqMin, deqMax, mini[i+1][j], maxi[i+1][j]);
        }
    }
}


void read_querry()
{
    for(int i=1; i<=p; ++i)
    {
        difmin = 8005;
        nr = 0;



        f>>dx>>dy;
        solve(dx, dy);
        if(dx != dy)
            solve(dy, dx);
        g<<difmin<<" "<<nr<<'\n';
    }
}


int main()
{
    read_mat();
    read_querry();
    return 0;
}