Cod sursa(job #3212125)

Utilizator ioanabaduIoana Badu ioanabadu Data 11 martie 2024 10:17:05
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.7 kb
#include <iostream>
#include <fstream>
#include <deque>
#include <climits>
#define N_MAX 1005

using namespace std;

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

short int n, m, mat[N_MAX][N_MAX];
short int maxx[N_MAX][N_MAX], minn[N_MAX][N_MAX], aux[N_MAX][N_MAX];
short int query;
deque <int> dq;

bool cmp (int a, int b, bool order){
    if (order == 1)
        return a >= b;
    return a <= b;
}

void completeMaxxMinn (int x, int y, bool order){ // the variable order dictates which matrix I complete -> maxx or minn;
    for (int i=1; i<=n; ++i){
        dq.clear();
        for (int j=1; j<=m; ++j){
            while (!dq.empty() && cmp(mat[i][j], mat[i][dq.back()], order))
                dq.pop_back();
            dq.push_back(j);

            if (j >= y){
                aux[i][j] = mat[i][dq.front()];
                if (j - dq.front() + 1 == y)
                    dq.pop_front();
            }
        }
    }

    for (int j=y; j<=m; ++j){
        dq.clear();
        for (int i=1; i<=n; ++i){
            while (!dq.empty() && cmp(aux[i][j], aux[dq.back()][j], order))
                dq.pop_back();
            dq.push_back(i);

            if (i >= x){
                if (order == 1)
                    maxx[i][j] = aux[dq.front()][j];
                else
                    minn[i][j] = aux[dq.front()][j];

                if (i - dq.front() + 1 == x)
                    dq.pop_front();
            }
        }
    }
}

pair <int, int> solve (int x, int y){
    int rez = INT_MAX;
    int cnt = 0;

    completeMaxxMinn(x, y, 1);
    completeMaxxMinn(x, y, 0);

    for (int i=x; i<=n; ++i){
        for (int j=y; j<=m; ++j){
            int diff = maxx[i][j] - minn[i][j];

            if (diff < rez){
                rez = diff;
                cnt = 1;
            }
            else if (diff == rez){
                cnt++;
            }
        }
    }

    return {rez, cnt};
}

int main()
{
    int x, y;

    in >> n >> m >> query;
    for (int i=1; i<=n; ++i)
        for (int j=1; j<=m; ++j)
            in >> mat[i][j];

    pair<int, int> ans1, ans2;
    for (int i=1; i<=query; ++i){
        in >> x >> y;

        ans1 = solve(x, y);
        ans2 = solve(y, x);

        if (x == y){
            out << ans1.first << ' ' << ans1.second;
        }
        else if (ans1.first < ans2.first){
            out << ans1.first << ' ' << ans1.second;
        }
        else if (ans1.first > ans2.first){
            out << ans2.first << ' ' << ans2.second;
        }
        else{
            out << ans1.first << ' ' << ans1.second + ans2.second;
        }
        out << '\n';
    }
    return 0;
}