Cod sursa(job #3289484)

Utilizator TeodorVTeodorV TeodorV Data 27 martie 2025 09:40:08
Problema Struti Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.31 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)
{
    vector<tuple<int, int, int, int>> rezMat;

    int difmin=INT_MAX,nr=0;
    for(int i=1; i<=n-DX+1; i++)
    {
        deque<pair<int, int>> dqmin,dqmax;
        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=0;
                rezMat.clear();
            }
            if(difmin==dqmax.front().first-dqmin.front().first)
            {
                nr++;
                rezMat.push_back(make_tuple(i, j-DY+1, i+DX-1, j));
            }
        }
    }

    if(DX!=DY)
    {

    for(int i=1; i<=n-DY+1; i++)
    {
        deque<pair<int, int>> dqmin,dqmax;
        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=0;
                rezMat.clear();
            }
            if(difmin==dqmax.front().first-dqmin.front().first)
            {
                nr++;
                rezMat.push_back(make_tuple(i, j-DX+1, i+DY-1, j));
            }
        }
    }
    }
//    for(unsigned int i=0; i<rezMat.size(); i++)
//        cout<<get<0>(rezMat[i])<<' '<<get<1>(rezMat[i])<<' '<<get<2>(rezMat[i])<<' '<<get<3>(rezMat[i])<<'\n';
//    cout<<'\n';

    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;
}