Cod sursa(job #3315240)

Utilizator Lex._.Lex Guiman Lex._. Data 13 octombrie 2025 10:14:37
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.64 kb
#include <bits/stdc++.h>
#define NMAX 1001
#define VMAX 8001
using namespace std;

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

int n, m;
int h[NMAX][NMAX];

int minim=VMAX, nr=0; ///diferenta de altitudine minima si numarul de terenuri cu aceasta diferenta minima
int maxime[NMAX][NMAX], minime[NMAX][NMAX]; ///maximele si minimele subsecventelor de lungime col de pe fiecare linie

void dif_min(int lin, int col) ///diferenta de altitudine minima dintre toate dreptunghiurile cu lungimile laturilor lin si col
{
    for(int i=1; i<=n; i++) ///calculam minimele si maximele pe subsecvente de lungime col pe fiecare linie
    {
        deque<int> dq_min, dq_max;
        for(int j=1; j<=m; j++)
        {
            while(!dq_min.empty() && h[i][j]<h[i][dq_min.back()]) ///minime
                dq_min.pop_back();
            dq_min.push_back(j);

            if(j-dq_min.front()>=col) dq_min.pop_front();
            minime[i][j]=h[i][dq_min.front()];


            while(!dq_max.empty() && h[i][j]>h[i][dq_max.back()]) ///maxime
                dq_max.pop_back();
            dq_max.push_back(j);

            if(j-dq_max.front()>=col) dq_max.pop_front();
            maxime[i][j]=h[i][dq_max.front()];
        }
    }

    for(int j=col; j<=m; j++)
    {
        deque<int> dq_min, dq_max; ///minimele si maximele pe coloane
        for(int i=1; i<=n; i++)
        {
            while(!dq_min.empty() && minime[i][j]<minime[dq_min.back()][j]) ///minime
                dq_min.pop_back();
            dq_min.push_back(i);

            if(i-dq_min.front()>=lin) dq_min.pop_front();


            while(!dq_max.empty() && maxime[i][j]>maxime[dq_max.back()][j]) ///maxime
                dq_max.pop_back();
            dq_max.push_back(i);

            if(i-dq_max.front()>=lin) dq_max.pop_front();

            if(i>=lin)
            {
                if(maxime[dq_max.front()][j]-minime[dq_min.front()][j]<minim)
                {
                    minim=maxime[dq_max.front()][j]-minime[dq_min.front()][j];
                    nr=1;
                }
                else if(maxime[dq_max.front()][j]-minime[dq_min.front()][j]==minim)
                {
                    nr++;
                }
            }
        }
    }
}

int main()
{
    int p;
    in >> n >> m >> p;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
            in >> h[i][j];
    }
    while(p--)
    {
        int dx, dy;
        in >> dx >> dy;
        dif_min(dx, dy);
        if(dx!=dy) dif_min(dy, dx);
        out << minim << " " << nr << "\n";
        minim=VMAX; nr=0;
    }

    return 0;
}