Cod sursa(job #2989880)

Utilizator MAlex2019Melintioi George Alexandru MAlex2019 Data 7 martie 2023 10:23:16
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <iostream>
#include <fstream>
#include <deque>

using namespace std;

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

const int maxn = 1000;
int v[maxn][maxn];
int minc[maxn][maxn];
int maxc[maxn][maxn];
int minl[maxn][maxn];
int maxl[maxn][maxn];

template <class cmp>
struct makeDQ {
    static void f1D(int n, int m, int h, int w, int from[maxn][maxn], int result[maxn][maxn]) {
        deque<int> goolah[maxn];
        for (int i = h - 1; i < n; i++)
            for (int j = 0; j < m; j++) {
                while (!goolah[i].empty() && cmp()(from[i][j], from[i][goolah[i].back()]))
                    goolah[i].pop_back();
                goolah[i].push_back(j);
                if (goolah[i].back() - goolah[i].front() >= w)
                    goolah[i].pop_front();
                result[i][j] = from[i][goolah[i].front()];
            }
    }
    static void f2D(int n, int m, int maxlen, int arr[maxn][maxn]) {
        deque<int> goolah[maxn];
        for (int j = 0; j < m; j++) {
            goolah[j].clear();
            for (int i = 0; i < n; i++) {
                while (!goolah[j].empty() && cmp()(v[i][j], v[goolah[j].back()][j]))
                    goolah[j].pop_back();
                goolah[j].push_back(i);
                if (goolah[j].back() - goolah[j].front() >= maxlen)
                    goolah[j].pop_front();
                arr[i][j] = v[goolah[j].front()][j];
            }
        }
    }
};

void query(int h, int w, int n, int m, int &mindif, int &cnt) {
    makeDQ<less_equal<int>>::f2D(n, m, h, minc);
    makeDQ<greater_equal<int>>::f2D(n, m, h, maxc);
    makeDQ<less_equal<int>>::f1D(n, m, h, w, minc, minl);
    makeDQ<greater_equal<int>>::f1D(n, m, h, w, maxc, maxl);
    for (int i = h - 1; i < n; i++)
        for (int j = w - 1; j < m; j++) {
            int dif = maxl[i][j] - minl[i][j];
            if (dif == mindif)
                cnt++;
            else if (dif < mindif) {
                mindif = dif;
                cnt = 1;
            }
        }
}

int main() {
    int n, m, p;
    fin >> n >> m >> p;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            fin >> v[i][j];
    for (int i = 0; i < p; i++) {
        int h, w;
        fin >> h >> w;
        int mindif = 2e9, cnt = 0;
        query(h, w, n, m, mindif, cnt);
        if (h != w)
            query(w, h, n, m, mindif, cnt);
        fout << mindif << ' ' << cnt << '\n';
    }

    return 0;
}