Cod sursa(job #3353232)

Utilizator AdrianRosuRosu Adrian Andrei AdrianRosu Data 5 mai 2026 17:30:24
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda cerc-acs-02-05-26 Marime 2.57 kb
#include <bits/stdc++.h>
#define DIM 1001

using namespace std;

ifstream fin("struti.in");

ofstream fout("struti.out");

int n, m, Q, dx, dy, ret, cnt, i, j, x, y;

int a[DIM][DIM], amin[DIM][DIM], amax[DIM][DIM];

void Solve(int dx, int dy)
{
    for (int i = 1; i <= n; i++) {

        deque <int> dqmin, dqmax;

        for (int j = 1; j <= m; j++) {

            while (!dqmin.empty() && dy <= j - dqmin.front()) {
                dqmin.pop_front();
            }

            while (!dqmin.empty() && a[i][dqmin.back()] >= a[i][j]) {
                dqmin.pop_back();
            }

            dqmin.push_back(j);

            if (j >= dy) {
                amin[i][j - dy + 1] = a[i][dqmin.front()];
            }

            while (!dqmax.empty() && dy <= j - dqmax.front()) {
                dqmax.pop_front();
            }

            while (!dqmax.empty() && a[i][dqmax.back()] <= a[i][j]) {
                dqmax.pop_back();
            }

            dqmax.push_back(j);

            if (j >= dy) {
                amax[i][j - dy + 1] = a[i][dqmax.front()];
            }

        }
    }

    for (int j = 1; j <= m - dy + 1; j++) {

        deque <int> dqmin, dqmax;

        for (int i = 1; i <= n; i++) {

            while (!dqmin.empty() && dx <= i - dqmin.front()) {
                dqmin.pop_front();
            }

            while (!dqmin.empty() && amin[dqmin.back()][j] >= amin[i][j]) {
                dqmin.pop_back();
            }

            dqmin.push_back(i);

            while (!dqmax.empty() && dx <= i - dqmax.front()) {
                dqmax.pop_front();
            }

            while (!dqmax.empty() && amax[dqmax.back()][j] <= amax[i][j]) {
                dqmax.pop_back();
            }

            dqmax.push_back(i);

            if (i >= dx) {
                int Min = amin[dqmin.front()][j];
                int Max = amax[dqmax.front()][j];
                if (Max - Min < ret) {
                    ret = Max - Min;
                    cnt = 1;
                } else if (Max - Min == ret) {
                    ++cnt;
                }
            }

        }
    }
}

int main(void)
{
    fin >> n >> m >> Q;

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

    while (Q--) {

        fin >> x >> y;

        ret = 1e9, cnt = 0;

        Solve(x, y);

        if (x != y) {
            swap(x, y);
            Solve(x, y);
        }

        fout << ret << " " << cnt << "\n";

    }
}