Cod sursa(job #2756067)

Utilizator MihneaCadar101Cadar Mihnea MihneaCadar101 Data 29 mai 2021 14:27:57
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <bits/stdc++.h>
using namespace std;

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

const int nmax = 1005;
int n, m, a[nmax][nmax], p, mini[nmax][nmax], maxi[nmax][nmax], ans, nr;

void rezolvare (int dx, int dy) {
    deque <int> minn, maxx;

    for (int j = 1; j <= m; ++j) {
        minn.clear();
        maxx.clear();
        for (int i = 1; i <= n; ++i) {
            while (!minn.empty() && i - minn.front() >= dx) minn.pop_front();
            while (!minn.empty() && a[i][j] <= a[minn.back()][j]) minn.pop_back();

            minn.push_back(i);

            while (!maxx.empty() && i - maxx.front() >= dx) maxx.pop_front();
            while (!maxx.empty() && a[i][j] >= a[maxx.back()][j]) maxx.pop_back();

            maxx.push_back(i);

            mini[i][j] = a[minn.front()][j];
            maxi[i][j] = a[maxx.front()][j];
        }
    }

    for (int i = dx; i <= n; ++i) {
        minn.clear();
        maxx.clear();
        for (int j = 1; j <= m; ++j) {
            while (!minn.empty() && j - minn.front() >= dy) minn.pop_front();
            while (!maxx.empty() && j - maxx.front() >= dy) maxx.pop_front();

            while (!minn.empty() && mini[i][j] <= mini[i][minn.back()]) minn.pop_back();
            while (!maxx.empty() && maxi[i][j] >= maxi[i][maxx.back()]) maxx.pop_back();

            minn.push_back(j);
            maxx.push_back(j);

            if (j >= dy) {
                if (maxi[i][maxx.front()] - mini[i][minn.front()] < ans) {
                    ans = maxi[i][maxx.front()] - mini[i][minn.front()];
                    nr = 1;
                }
                else if (maxi[i][maxx.front()] - mini[i][minn.front()] == ans) ++nr;
            }
        }
    }
}

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

    for (int k = 1; k <= p; ++k) {
        int dx, dy;
        fin >> dx >> dy;
        ans = INT_MAX, nr = 0;
        rezolvare(dx, dy);
        if (dx != dy) rezolvare(dy, dx);

        fout << ans << ' ' << nr << '\n';
    }

    return 0;
}