Cod sursa(job #2776063)

Utilizator marcumihaiMarcu Mihai marcumihai Data 18 septembrie 2021 15:49:43
Problema Struti Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.74 kb
#include <bits/stdc++.h>

using namespace std;

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

int n,m;
int mt[1005][1005];
int minim[1005][1005];
int maxim[1005][1005];
int q;
int nrminim=9999999;
int cont=0;


void fct(int lin , int col)

{
    deque <pair<int,int>> st;
        for(int j=1; j<=m; ++j)
        {
            for(int i=1; i<=lin-1; ++i)
            {
                while(!st.empty() && st.back().first<mt[i][j])
                    st.pop_back();
                st.push_back({mt[i][j], i});
            }
            for(int i=lin; i<=n; ++i)
            {
                if(!st.empty() && i-st.front().second>=lin)
                    st.pop_front();
                while(!st.empty() && st.back().first<mt[i][j])
                    st.pop_back();

                st.push_back({mt[i][j], i});
                maxim[i][j]=st.front().first;
            }


            while(!st.empty())
                st.pop_back();
        }


        while(!st.empty())
            st.pop_back();


        for(int j=1; j<=m; ++j)
        {
            for(int i=1; i<=lin-1; ++i)
            {
                while(!st.empty() && st.back().first>mt[i][j])
                    st.pop_back();
                st.push_back({mt[i][j], i});
            }
            for(int i=lin; i<=n; ++i)
            {
                if(!st.empty() && i-st.front().second>=lin)
                    st.pop_front();
                while(!st.empty() && st.back().first>mt[i][j])
                    st.pop_back();

                st.push_back({mt[i][j], i});
                minim[i][j]=st.front().first;
            }
            while(!st.empty())
                st.pop_back();
        }





        deque <pair<int,int>> mini;
        deque <pair<int, int >> maxi;
        for(int i=lin; i<=n; ++i)
        {
            for(int j=1; j<col; ++j)
            {
                while(!maxi.empty() && maxi.back().first<maxim[i][j])
                    maxi.pop_back();
                maxi.push_back({maxim[i][j], j});


                while(!mini.empty() && mini.back().first>minim[i][j])
                    mini.pop_back();
                mini.push_back({minim[i][j], j});

            }
            for(int j=col; j<=m; ++j)
            {
                if(!maxi.empty() && j-maxi.front().second>=col)
                    maxi.pop_front();
                while(!maxi.empty() && maxi.back().first<maxim[i][j])
                    maxi.pop_back();

                maxi.push_back({maxim[i][j], j});


                if(!mini.empty() && j-mini.front().second>=col)
                    mini.pop_front();
                while(!mini.empty() && mini.back().first>minim[i][j])
                    mini.pop_back();

                mini.push_back({minim[i][j], j});




                if(maxi.front().first-mini.front().first<nrminim)
                {
                    nrminim=maxi.front().first-mini.front().first;
                    cont=1;
                }
                else if(maxi.front().first-mini.front().first==nrminim)
                {
                    ++cont;
                }
            }

            while(!mini.empty())
                mini.pop_back();

            while(!maxi.empty())
                maxi.pop_back();




        }
}





int main()
{
    f>>n>>m>>q;
    for(int i=1; i<=n; ++i)
    {
        for(int j=1; j<=m; ++j)
            f>>mt[i][j];
    }
    for(int query=1; query<=q; ++query)
    {
        int lin,col;
        f>>lin>>col;

        nrminim=9999999;
        cont=0;

        fct(lin , col);
        if(lin!=col)
            fct(col , lin);

        g<<nrminim<<" "<<cont<<"\n";

    }
    return 0;
}