Cod sursa(job #3136653)

Utilizator TeodoraMaria123Serban Teodora Maria TeodoraMaria123 Data 7 iunie 2023 14:39:32
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 int MAX_M = 1000;
const int MAX_N = 1000;

int n, m, p;
int a[MAX_N + 1][MAX_M + 1];
deque <int> minColumn[MAX_M + 1], maxColumn[MAX_M + 1];
deque <int> minArea, maxArea;

int query(int x, int y, int &cnt)
{
    int ans = INT_MAX;
    cnt = 0;
    for(int j = 1; j <= m; j ++)
        maxColumn[j].clear(), minColumn[j].clear();
    minArea.clear();
    maxArea.clear();

    for(int i = 1; i <= n; i ++)
    {
        minArea.clear();
        maxArea.clear();

        for(int j = 1; j <= m; j ++)
        {
            if(!minColumn[j].empty()  &&  i > x  && a[i - x][j] == minColumn[j].front())
                minColumn[j].pop_front();
            while(!minColumn[j].empty()  &&  minColumn[j].back() > a[i][j])
                minColumn[j].pop_back();
            minColumn[j].push_back(a[i][j]);

            if(!maxColumn[j].empty()  &&  i > x  &&  a[i - x][j] == maxColumn[j].front())
                maxColumn[j].pop_front();
            while(!maxColumn[j].empty()  &&  maxColumn[j].back() < a[i][j])
                maxColumn[j].pop_back();
            maxColumn[j].push_back(a[i][j]);

            if(!minArea.empty()  &&  j > y  &&  minColumn[j - y].front() == minArea.front())
                minArea.pop_front();
            while(!minArea.empty()  &&  minArea.back() > minColumn[j].front())
                minArea.pop_back();
            minArea.push_back(minColumn[j].front());

            if(!maxArea.empty()  &&  j > y  &&  maxColumn[j - y].front() == maxArea.front())
                maxArea.pop_front();
            while(!maxArea.empty()  &&  maxArea.back() < maxColumn[j].front())
                maxArea.pop_back();
            maxArea.push_back(maxColumn[j].front());

            if(i >= x  && j >= y)
            {
                if(maxArea.front() - minArea.front() < ans)
                {
                    ans = maxArea.front() - minArea.front();
                    cnt = 1;
                }
                else if(maxArea.front() - minArea.front() == ans)
                    cnt ++;
            }
        }
    }
    return ans;
}

int main()
{
    ios_base :: sync_with_stdio(0);
    cin.tie(0);

    freopen("struti.in", "r", stdin);
    freopen("struti.out", "w", stdout);

    cin >> n >> m >> p;
    for(int i = 1; i <= n; i ++)
    {
        for(int j = 1; j <= m; j ++)
            cin >> a[i][j];
    }

    for(int i = 1; i <= p; i ++)
    {
        int a, b, cnt1, cnt2;
        cin >> a >> b;

        if(a != b)
        {
            int x = query(a, b, cnt1);
            int y = query(b, a, cnt2);

            if(x == y)
                cout << x << " " << cnt1 + cnt2 << "\n";
            else if(x < y)
                cout << x << " " << cnt1 << "\n";
            else
                cout << y << " " << cnt2 << "\n";
        }
        else
            cout << query(a, b, cnt1) << " " << cnt1 << "\n";
    }
    return 0;
}