Cod sursa(job #3307660)

Utilizator iccjocIoan CHELARU iccjoc Data 22 august 2025 16:22:41
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.14 kb
#include <bits/stdc++.h>
using namespace std;

int n, m, p;
vector<vector<int>> v(1005, vector<int>(1005, 0));

pair<int, int> solve(int dx, int dy)
{
    int ai = INT_MAX;
    int an = 0;
    vector<vector<int>> xm(1005, vector<int>(1005, 0));
    vector<vector<int>> xM(1005, vector<int>(1005, 0));
    for(int i = 1; i <= n; i++)
    {
        deque<int> dm;
        deque<int> dM;
        for(int j = 1; j <= m; j++)
        {
            while(dm.size() && v[i][dm.back()] >= v[i][j])
            {
                dm.pop_back();
            }
            dm.push_back(j);
            if(dm.front() == j - dy)
            {
                dm.pop_front();
            }

            while(dM.size() && v[i][dM.back()] <= v[i][j])
            {
                dM.pop_back();
            }
            dM.push_back(j);
            if(dM.front() == j - dy)
            {
                dM.pop_front();
            }

            if(j >= dy)
            {
                xm[i][j] = v[i][dm.front()];
                xM[i][j] = v[i][dM.front()];
            }
        }
    }
    for(int j = dy; j <= m; j++)
    {
        deque<int> dm;
        deque<int> dM;
        for(int i = 1; i <= n; i++)
        {
            while(dm.size() && xm[dm.back()][j] >= xm[i][j])
            {
                dm.pop_back();
            }
            dm.push_back(i);
            if(dm.front() == i - dx)
            {
                dm.pop_front();
            }

            while(dM.size() && xM[dM.back()][j] <= xM[i][j])
            {
                dM.pop_back();
            }
            dM.push_back(i);
            if(dM.front() == i - dx)
            {
                dM.pop_front();
            }

            if(i >= dx)
            {
                if(xM[dM.front()][j] - xm[dm.front()][j] < ai)
                {
                    ai = xM[dM.front()][j] - xm[dm.front()][j];
                    an = 1;
                }
                else if(xM[dM.front()][j] - xm[dm.front()][j] == ai)
                {
                    an++;
                }
            }
        }
    }
    return {ai, an};
}

int main()
{
    freopen("struti.in", "r", stdin);
    freopen("struti.out", "w", stdout);
    cin.tie(nullptr)->sync_with_stdio(false);
    cin >> n >> m >> p;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            cin >> v[i][j];
        }
    }
    int x, y;
    while(p--)
    {
        cin >> x >> y;
        if(x == y)
        {
            pair<int, int> a1 = solve(x, y);
            cout << a1.first << " " << a1.second << "\n";
        }
        else
        {
            pair<int, int> a1 = solve(x, y), a2 = solve(y, x);
            if(a1.first < a2.first)
            {
                cout << a1.first << " " << a1.second << "\n";
            }
            else if(a1.first > a2.first)
            {
                cout << a2.first << " " << a2.second << "\n";
            }
            else
            {
                cout << a1.first << " " << a1.second + a2.second << "\n";
            }
        }
    }
}