Cod sursa(job #3306023)

Utilizator tedicTheodor Ciobanu tedic Data 6 august 2025 18:08:20
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.8 kb
#include <bits/stdc++.h>

using namespace std;
int n,m,teste, v[1005][1005], minn=INT_MAX, cntMin=0;
int matMax[1005][1005], matMin[1005][1005];
void rezolv(int dx, int dy)
{

    for(int i=1; i<=n; i++)
    {
        deque<int> cresc, desc;
        for(int j=1; j<dx; j++)
        {
            while(!desc.empty() && v[i][j]<v[i][desc.back()])
                desc.pop_back();
            desc.push_back(j);

            while(!cresc.empty() && v[i][j]>v[i][cresc.back()])
                cresc.pop_back();
            cresc.push_back(j);
        }
        for(int j=dx; j<=m; j++)
        {
            while(!desc.empty() && v[i][j]<v[i][desc.back()])
                desc.pop_back();
            desc.push_back(j);
            while(!desc.empty() && j-desc.front()>=dx)
                desc.pop_front();
            matMin[i][j-dx+1]=v[i][desc.front()];

            while(!cresc.empty() && v[i][j]>v[i][cresc.back()])
                cresc.pop_back();
            cresc.push_back(j);
            while(!cresc.empty() && j-cresc.front()>=dx)
                cresc.pop_front();
            matMax[i][j-dx+1]=v[i][cresc.front()];
        }
    }


    for(int j=1; j<=m-dx+1; j++)
    {
        deque<int> cresc, desc;
        for(int i=1; i<dy; i++)
        {
            while(!desc.empty() && matMin[i][j]<matMin[desc.back()][j])
                desc.pop_back();
            desc.push_back(i);

            while(!cresc.empty() && matMax[i][j]>matMax[cresc.back()][j])
                cresc.pop_back();
            cresc.push_back(i);
        }
        for(int i=dy; i<=n; i++)
        {
            while(!desc.empty() && matMin[i][j]<matMin[desc.back()][j])
                desc.pop_back();
            desc.push_back(i);
            while(!desc.empty() && i-desc.front()>=dy)
                desc.pop_front();

            while(!cresc.empty() && matMax[i][j]>matMax[cresc.back()][j])
                cresc.pop_back();
            cresc.push_back(i);
            while(!cresc.empty() && i-cresc.front()>=dy)
                cresc.pop_front();

            int x=matMax[cresc.front()][j]; ///x este maximul din tabelul de latime dx, inaltime dy ce incepe in i,j
            int y=matMin[desc.front()][j];
            if(x-y<minn)
                minn=x-y, cntMin=1;
            else if(x-y==minn)
                cntMin++;
        }
    }

}
int main()
{
    ifstream cin("struti.in");
    ofstream cout("struti.out");
    cin>>n>>m>>teste;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            cin>>v[i][j];
    while(teste--)
    {
        minn=INT_MAX;
        cntMin=0;
        int l1, l2;
        cin>>l1>>l2;
        rezolv(l1,l2);
        if(l1!=l2)
        rezolv(l2,l1);
        cout<<minn<<" "<<cntMin<<'\n';
    }
    return 0;
}