Cod sursa(job #3333086)

Utilizator RuxandraPro12_Metehau Ruxandra Maria RuxandraPro12_ Data 10 ianuarie 2026 22:14:10
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.89 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N_MAX = 1005;

int m, n, p;
int a[N_MAX][N_MAX];
pair <int, int> b[N_MAX][N_MAX], c[N_MAX][N_MAX];
deque <int> dq1, dq2;

int solve(int dx, int dy, int &cnt) {
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            b[i][j] = c[i][j] = {0, 0};
    /// pe coloane
    for (int j = 1; j <= m; j++) {
        dq1.clear();
        dq2.clear();
        for (int i = 1; i <= n; i++) {
            /// minim
            while (!dq1.empty() && a[dq1.back()][j] >= a[i][j])
                dq1.pop_back();
            dq1.push_back(i);
            /// maxim
            while (!dq2.empty() && a[dq2.back()][j] <= a[i][j])
                dq2.pop_back();
            dq2.push_back(i);
            if (dq1.front() <= i - dx)
                dq1.pop_front();
            if (dq2.front() <= i - dx)
                dq2.pop_front();
            if (i >= dx) {
                b[i][j].first = a[dq1.front()][j];
                b[i][j].second = a[dq2.front()][j];
            }
        }
    }
    /// pe linii
    int alt_min = INT_MAX;
    cnt = 0;
    for (int i = dx; i <= n; i++) {
        dq1.clear();
        dq2.clear();
        for (int j = 1; j <= m; j++) {
            /// minim
            while (!dq1.empty() && b[i][dq1.back()].first >= b[i][j].first)
                dq1.pop_back();
            dq1.push_back(j);
            /// maxim
            while (!dq2.empty() && b[i][dq2.back()].second <= b[i][j].second)
                dq2.pop_back();
            dq2.push_back(j);
            if (dq1.front() <= j - dy)
                dq1.pop_front();
            if (dq2.front() <= j - dy)
                dq2.pop_front();
            if (j >= dy) {
                int mini = b[i][dq1.front()].first, maxi = b[i][dq2.front()].second;
                int dif = maxi - mini;
                if (dif < alt_min) {
                    alt_min = dif;
                    cnt = 1;
                }
                else if (dif == alt_min)
                    cnt++;
            }
        }
    }
    return alt_min;
}


int main() {
    fin >> n >> m >> p;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++)
            fin >> a[i][j];
    }
    while (p--) {
        int dx, dy;
        fin >> dx >> dy;
        if (dx == dy) {
            int cnt = 0, mini = solve(dx, dy, cnt);
            fout << mini << " " << cnt << "\n";
            continue;
        }
        int cnt1 = 0, cnt2 = 0;
        int min1 = solve(dx, dy, cnt1), min2 = solve(dy, dx, cnt2);
        if (min1 < min2)
            fout << min1 << " " << cnt1 << "\n";
        else if (min1 == min2)
            fout << min1 << " " << cnt1 + cnt2 << "\n";
        else
            fout << min2 << " " << cnt2 << "\n";
    }
    return 0;
}