Cod sursa(job #3353355)

Utilizator cristiz123456Zoescu Cristian cristiz123456 Data 6 mai 2026 14:30:55
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.82 kb
#include <bits/stdc++.h>

using namespace std;
const int N = 1000;
int n, m;
int v[N][N], x[N][N], dif[N][N];
int ans1, ans2;
void solve(int dx, int dy)
{
    deque <int> dq;
    for(int j = 0; j < m; j++)
    {
        dq.clear();
        for(int i = 0; i < n; i++)
        {
            dif[i][j] = 0;
            while(!dq.empty() && v[i][j] >= v[dq.back()][j])
            {
                dq.pop_back();
            }
            dq.push_back(i);
            if(dq.front() < i - dx + 1)
                dq.pop_front();
            if(i >= dx - 1)
            {
                x[i][j] = v[dq.front()][j];
            }
        }
    }
    for(int i = 0; i < n; i++)
    {
        dq.clear();
        for(int j = 0; j < m; j++)
        {
            while(!dq.empty() && x[i][j] >= x[i][dq.back()])
            {
                dq.pop_back();
            }
            dq.push_back(j);
            if(dq.front() < j - dy + 1)
                dq.pop_front();
            if(j >= dy - 1)
            {
                dif[i][j] += x[i][dq.front()];
            }
        }
    }
    for(int j = 0; j < m; j++)
    {
        dq.clear();
        for(int i = 0; i < n; i++)
        {
            while(!dq.empty() && v[i][j] <= v[dq.back()][j])
            {
                dq.pop_back();
            }
            dq.push_back(i);
            if(dq.front() < i - dx + 1)
                dq.pop_front();
            if(i >= dx - 1)
            {
                x[i][j] = v[dq.front()][j];
            }
        }
    }
    for(int i = 0; i < n; i++)
    {
        dq.clear();
        for(int j = 0; j < m; j++)
        {
            while(!dq.empty() && x[i][j] <= x[i][dq.back()])
            {
                dq.pop_back();
            }
            dq.push_back(j);
            if(dq.front() < j - dy + 1)
                dq.pop_front();
            if(j >= dy - 1)
            {
                dif[i][j] -= x[i][dq.front()];
            }
        }
    }
    for(int i = dx - 1; i < n; i++)
    {
        for(int j = dy - 1; j < m; j++)
        {
            if(dif[i][j] < ans1)
            {
                ans1 = dif[i][j];
                ans2 = 1;
            }
            else if(dif[i][j] == ans1)
            {
                ans2++;
            }
        }
    }
}
int main()
{
    ifstream cin("struti.in");
    ofstream cout("struti.out");
    int i, j, p, dx, dy;
    cin >> n >> m >> p;
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < m; j++)
        {
            cin >> v[i][j];
        }
    }
    for(i = 0; i < p; i++)
    {
        cin >> dx >> dy;
        ans1 = INT_MAX;
        ans2 = 0;
        solve(dx, dy);
        if(dy != dx)
            solve(dy, dx);
        cout << ans1 << " " << ans2 << "\n";
    }
    return 0;
}