Cod sursa(job #2724426)

Utilizator MihneaCadar101Cadar Mihnea MihneaCadar101 Data 17 martie 2021 00:41:02
Problema Struti Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.79 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;
bool marked[nmax];

struct elem {
    int nr, x;
    bool operator < (const elem &aux) const {
        if (nr != aux.nr) return nr < aux.nr;
        return x < aux.x;
    }

    bool operator > (const elem &aux) const {
        if (nr != aux.nr) return nr > aux.nr;
        return x < aux.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;
        int ans = 0, MINI = INT_MAX;
        memset(marked, 0, m + 5);
        for (int i2 = 1; i2 + dx <= n; ++i2) {
            memset(marked, 0, m + 5);
            int ii = i2 + dx - 1;
            priority_queue <elem, vector <elem> > q1;
            priority_queue <elem, vector <elem>, greater <elem> > q2;
            for (int j = 1; j <= m; ++j) {
                int mini = INT_MAX, maxi = 0;
                for (int i = i2; i <= ii; ++i) {
                    if (a[i][j] < mini) mini = a[i][j];

                    if (a[i][j] > maxi) maxi = a[i][j];
                }

                if (j > dy) {
                    marked[j - dy] = true;
                }

                q2.push({mini, j});
                q1.push({maxi, j});
                int pos = q1.top().x;
                while (!q1.empty() && marked[pos]) {
                    q1.pop();
                    pos = q1.top().x;
                }

                pos = q2.top().x;
                while (!q2.empty() && marked[pos]) {
                    q2.pop();
                    pos = q2.top().x;
                }

                int nr1 = q2.top().nr, nr2 = q1.top().nr;
                if (j >= dy) {
                    if (nr2 - nr1 < MINI) {
                        MINI = nr2 - nr1;
                        ans = 1;
                    }
                    else if (nr2 - nr1 == MINI) ++ans;
                }
            }

        }

        if (dx != dy) {
            swap(dx, dy);
            for (int i2 = 1; i2 + dx <= n; ++i2) {
                int ii = i2 + dx - 1;
                memset(marked, 0, m + 5);
                priority_queue <elem, vector <elem> > q1;
                priority_queue <elem, vector <elem>, greater <elem> > q2;
                for (int j = 1; j <= m; ++j) {
                    int mini = INT_MAX, maxi = 0;
                    for (int i = i2; i <= ii; ++i) {
                        if (a[i][j] < mini) mini = a[i][j];

                        if (a[i][j] > maxi) maxi = a[i][j];
                        }

                    if (j > dy) {
                        marked[j - dy] = true;
                    }

                    q2.push({mini, j});
                    q1.push({maxi, j});
                    int pos = q1.top().x;
                    while (!q1.empty() && marked[pos]) {
                        q1.pop();
                        pos = q1.top().x;
                    }

                    pos = q2.top().x;
                    while (!q2.empty() && marked[pos]) {
                        q2.pop();
                        pos = q2.top().x;
                    }

                    int nr1 = q2.top().nr, nr2 = q1.top().nr;
                    if (j >= dy) {
                        if (nr2 - nr1 < MINI) {
                            MINI = nr2 - nr1;
                            ans = 1;
                        }
                        else if (nr2 - nr1 == MINI) ++ans;
                    }
                }
            }
        }

        fout << MINI << ' ' << ans + 1<< '\n';
    }
    return 0;
}