Cod sursa(job #3144859)

Utilizator alexandru_ioan.06Alexandru Ioan alexandru_ioan.06 Data 10 august 2023 21:45:28
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.18 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], maxi[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;
    deque <int> maxD[dim], minD[dim];
    for(int j = 1 ; j <= m ; ++j)
        for(int i = 1 ; i <= l ; ++i)
        {
            while(!minD[j].empty() && minD[j].back() > a[i][j])
                minD[j].pop_back();
            minD[j].push_back(a[i][j]);
            while(!maxD[j].empty() && maxD[j].back() < a[i][j])
                maxD[j].pop_back();
            maxD[j].push_back(a[i][j]);
        }
    for(int i = l ; i <= n ; ++i)
    {
        deque <int> dqMax, dqMin;
        for(int j = 1 ; j <= c ; ++j)
        {
            while(!dqMax.empty() && dqMax.back() < maxD[j].front())
                dqMax.pop_back();
            dqMax.push_back(maxD[j].front());
            while(!dqMin.empty() && dqMin.back() > minD[j].front())
                dqMin.pop_back();
            dqMin.push_back(minD[j].front());

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

    }
}

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