Cod sursa(job #3158587)

Utilizator octavian202Caracioni Octavian Luca octavian202 Data 19 octombrie 2023 09:44:26
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <iostream>
#include <fstream>
#include <deque>

using namespace std;

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

const int NMAX = 1003;
int a[NMAX][NMAX], n, m;
int maxi[NMAX][NMAX], mini[NMAX][NMAX];
deque<pair<int, int> > dqmax, dqmin;
int nmin = 1e9, nr = 0;

void solve(int dx, int dy) {


    for (int i = 1; i <= n; i++) {
        while (!dqmax.empty())
            dqmax.pop_back();
        while (!dqmin.empty())
            dqmin.pop_back();
        for (int j = 1; j <= m; j++) {
            while (!dqmin.empty() && dqmin.front().second < j - dy + 1) {
                dqmin.pop_front();
            }
            while (!dqmax.empty() && dqmax.front().second < j - dy + 1) {
                dqmax.pop_front();
            }

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

            dqmax.push_back(make_pair(a[i][j], j));
            dqmin.push_back(make_pair(a[i][j], j));

            maxi[i][j] = dqmax.front().first;
            mini[i][j] = dqmin.front().first;
        }
    }


    for (int j = 1; j <= m; j++) {
        while (!dqmax.empty())
            dqmax.pop_back();
        while (!dqmin.empty())
            dqmin.pop_back();
        for (int i = 1; i <= n; i++) {
            while (!dqmin.empty() && dqmin.front().second < i - dx + 1) {
                dqmin.pop_front();
            }
            while (!dqmax.empty() && dqmax.front().second < i - dx + 1) {
                dqmax.pop_front();
            }

            while (!dqmin.empty() && dqmin.back().first > mini[i][j]) {
                dqmin.pop_back();
            }
            while (!dqmax.empty() && dqmax.back().first < maxi[i][j]) {
                dqmax.pop_back();
            }

            dqmax.push_back(make_pair(maxi[i][j], i));
            dqmin.push_back(make_pair(mini[i][j], i));

            if (i >= dx && j >= dy) {
                int dif = dqmax.front().first - dqmin.front().first;
                if (dif < nmin) {
                    nmin = dif;
                    nr = 1;
                } else if (dif == nmin) {
                    nr++;
                }
            }
        }
    }
}

int main() {

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

    while (q--) {
        int dx, dy;
        fin >> dx >> dy;

        nmin = 1e9;
        nr = 0;

        if (dx == dy) {
            solve(dx, dy);
        } else {
            solve(dx, dy);
            solve(dy, dx);
        }

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

    return 0;
}