Cod sursa(job #3289488)

Utilizator TeodorVTeodorV TeodorV Data 27 martie 2025 09:59:12
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.97 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;
    vector<deque<int>> vmax(m),vmin(m);

    for(int j=1; j<=m; j++)
    {
        for(int i=1; i<DX; i++)
        {
            while(!vmin[j-1].empty() && a[vmin[j-1].back()][j]>=a[i][j])
                vmin[j-1].pop_back();
            vmin[j-1].push_back(i);

            while(!vmax[j-1].empty() && a[vmax[j-1].back()][j]<=a[i][j])
                vmax[j-1].pop_back();
            vmax[j-1].push_back(i);
        }
    }

    for(int i=DX; i<=n; i++)
    {
        dqmin.clear(); dqmax.clear();
        for(int j=1; j<=m; j++)
        {
            while(!vmin[j-1].empty() && a[vmin[j-1].back()][j]>=a[i][j])
                vmin[j-1].pop_back();
            vmin[j-1].push_back(i);
            while(vmin[j-1].front()<=i-DX)
                vmin[j-1].pop_front();

            while(!vmax[j-1].empty() && a[vmax[j-1].back()][j]<=a[i][j])
                vmax[j-1].pop_back();
            vmax[j-1].push_back(i);
            while(vmax[j-1].front()<=i-DX)
                vmax[j-1].pop_front();



            int cvmax=a[vmax[j-1].front()][j],cvmin=a[vmin[j-1].front()][j];

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

            while(!dqmax.empty() && dqmax.back().first<=cvmax)
                dqmax.pop_back();
            dqmax.push_back(make_pair(cvmax, 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++;
            }
        }
    }
    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 ans1=query(lmax, cmax);
        if(lmax==cmax)
        {
            fout<<ans1.first<<' '<<ans1.second<<'\n';
            continue;
        }
        auto ans2=query(cmax, lmax);

        if(ans1.first<ans2.first)
        {
            fout<<ans1.first<<' '<<ans1.second<<'\n';
        }
        else if(ans2.first<ans1.first)
        {
            fout<<ans2.first<<' '<<ans2.second<<'\n';
        }
        else fout<<ans1.first<<' '<<ans1.second+ans2.second<<'\n';
    }

    return 0;
}