Cod sursa(job #3289486)

Utilizator TeodorVTeodorV TeodorV Data 27 martie 2025 09:44:50
Problema Struti Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.93 kb
#include <bits/stdc++.h>

using namespace std;

const string NUMEFISIER="struti";
ifstream fin(NUMEFISIER+".in");
ofstream fout(NUMEFISIER+".out");

const int Nmax=1001;
int a[Nmax][Nmax],n,m;

pair<int, int> query(int DX, int DY)
{

    int difmin=INT_MAX,nr=0;
    deque<pair<int, int>> dqmin,dqmax;
    for(int i=1; i<=n-DX+1; i++)
    {
        dqmin.clear(); dqmax.clear();
        for(int j=1; j<=m; j++)
        {
            int vmax=INT_MIN,vmin=INT_MAX;
            for(int k=i; k<i+DX; k++)
            {
                vmax=max(vmax, a[k][j]);
                vmin=min(vmin, a[k][j]);
            }

            while(!dqmin.empty() && dqmin.back().first>=vmin)
                dqmin.pop_back();
            dqmin.push_back(make_pair(vmin, j));
            if(dqmin.front().second<=j-DY)
                dqmin.pop_front();

            while(!dqmax.empty() && dqmax.back().first<=vmax)
                dqmax.pop_back();
            dqmax.push_back(make_pair(vmax, j));
            if(dqmax.front().second<=j-DY)
                dqmax.pop_front();

            if(j<DY) continue;

            if(difmin>dqmax.front().first-dqmin.front().first)
            {
                difmin=dqmax.front().first-dqmin.front().first;
                nr=1;
            }
            else if(difmin==dqmax.front().first-dqmin.front().first)
            {
                nr++;
            }
        }
    }

    if(DX!=DY)
    {

    for(int i=1; i<=n-DY+1; i++)
    {
        dqmin.clear(); dqmax.clear();
        for(int j=1; j<=m; j++)
        {
            int vmax=INT_MIN,vmin=INT_MAX;
            for(int k=i; k<i+DY; k++)
            {
                vmax=max(vmax, a[k][j]);
                vmin=min(vmin, a[k][j]);
            }

            while(!dqmin.empty() && dqmin.back().first>=vmin)
                dqmin.pop_back();
            dqmin.push_back(make_pair(vmin, j));
            if(dqmin.front().second<=j-DX)
                dqmin.pop_front();

            while(!dqmax.empty() && dqmax.back().first<=vmax)
                dqmax.pop_back();
            dqmax.push_back(make_pair(vmax, j));
            if(dqmax.front().second<=j-DX)
                dqmax.pop_front();

            if(j<DX) continue;
            if(difmin>dqmax.front().first-dqmin.front().first)
            {
                difmin=dqmax.front().first-dqmin.front().first;
                nr=1;
            }
            else if(difmin==dqmax.front().first-dqmin.front().first)
            {
                nr++;
            }
        }
    }
    }

    return make_pair(difmin, nr);
}

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

    int lmax,cmax;
    for(int q=1; q<=Q; q++)
    {
        fin>>lmax>>cmax;
        auto ans=query(lmax, cmax);
        fout<<ans.first<<' '<<ans.second<<'\n';
    }

    return 0;
}