Cod sursa(job #3144850)

Utilizator alexandru_ioan.06Alexandru Ioan alexandru_ioan.06 Data 10 august 2023 21:04:03
Problema Struti Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.64 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("struti.in");
ofstream fout ("struti.out");

const int dim = 1e3 + 5;

int a[dim][dim] , n , m , q , ans , frq , ans1 , frq1 , l , c;

void Solve (int l , int c , int &ans , int &frq)
{
    ans = INT_MAX , frq = 0;
    for(int k = 1 ; k + c - 1 <= m ; ++k)
    {
        deque <int> minD , maxD;
        for(int i = 1 ; i <= l ; ++i)
            for(int j = k ; j <= k + c - 1 ; ++j)
                {
                    while(!minD.empty() && minD.back() > a[i][j])
                        minD.pop_back();
                    minD.push_back(a[i][j]);
                     while(!maxD.empty() && maxD.back() < a[i][j])
                        maxD.pop_back();
                    maxD.push_back(a[i][j]);
                }
        if(maxD.front() - minD.front() < ans)
            ans = maxD.front() - minD.front() , frq = 1;
        else if(maxD.front() - minD.front() == ans)
            ++frq;
        for(int i = 2 ; i + l - 1 <= n ; ++i)
            {
                for(int j = k ; j <= k + c - 1 ; ++j)
                    {
                        if(!minD.empty() && a[i - 1][j] == minD.front())
                            minD.pop_front();
                        if(!maxD.empty() && a[i - 1][j] == maxD.front())
                            maxD.pop_front();
                    }
                for(int j = k ; j <= k + c - 1 ; ++j)
                    {
                        while(!minD.empty() && minD.back() > a[i + l - 1][j])
                            minD.pop_back();
                        minD.push_back(a[i + l - 1][j]);
                        while(!maxD.empty() && maxD.back() < a[i + l - 1][j])
                            maxD.pop_back();
                        maxD.push_back(a[i + l - 1][j]);
                    }
                if(maxD.front() - minD.front() < ans)
                    ans = maxD.front() - minD.front() , frq = 1;
                else if(maxD.front() - minD.front() == ans)
                    ++frq;

            }
    }
}

int main()
{
    fin >> n >> m >> q;
    for(int i = 1 ; i <= n ; ++i)
        for(int j = 1 ; j <= m ; ++j)
            fin >> a[i][j];
    while(q--)
        {
            fin >> l >> c;
            Solve(l , c , ans , frq);
            if(l != c && ans != 0)
                Solve(c , l , ans1 , frq1);
            if(ans < ans1 || l == c)
                fout << ans << " " << frq << '\n';
            else if(ans == ans1 && l != c)
                fout << ans << " " << frq + frq1 << '\n';
            else
                fout << ans1 << " " << frq1 << '\n';
        }
}