Cod sursa(job #2833288)

Utilizator mihaistamatescuMihai Stamatescu mihaistamatescu Data 15 ianuarie 2022 01:09:16
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.86 kb
#include <fstream>
#include <deque>

using namespace std;
int n, m, k, x, y, sol, ap;
deque<int> dmin;
deque<int> dmax;

int v[1010][1010];
int maxim[1010][1010];
int minim[1010][1010];

int main() {
    ifstream fin("struti.in");
    ofstream fout("struti.out");
    fin >> n >> m >> k;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            fin >> v[i][j];
        }
    }
    while (k--) {
        fin >> x >> y;
        sol = 8001;
        ap=0;
        for (int j = 1; j <= m; j++) {
            dmin.push_back(1);
            dmax.push_back(1);
            for (int i = 2; i <= n; i++) {
                while (!dmin.empty() && v[i][j] <= v[dmin.back()][j]) {
                    dmin.pop_back();
                }
                dmin.push_back(i);
                if (i - dmin.front() == x) {
                    dmin.pop_front();
                }
                if (i>=x){
                    minim[i][j]=v[dmin.front()][j];
                }
                while (!dmax.empty() && v[i][j] >= v[dmax.back()][j]) {
                    dmax.pop_back();
                }
                dmax.push_back(i);
                if (i - dmax.front() == x) {
                    dmax.pop_front();
                }
                if (i>=x){
                    maxim[i][j]=v[dmax.front()][j];
                }
            }
            dmin.clear();
            dmax.clear();
        }
        for (int i=x;i<=n;i++) {
            dmin.push_back(1);
            dmax.push_back(1);
            for (int j = 2; j <= m; j++) {
                while (!dmin.empty() && minim[i][j] < minim[i][dmin.back()]){
                    dmin.pop_back();
                }
                dmin.push_back(j);
                if (j-dmin.front()==y){
                    dmin.pop_front();
                }
                while (!dmax.empty() && maxim[i][j] > maxim[i][dmax.back()]){
                    dmax.pop_back();
                }
                dmax.push_back(j);
                if (j-dmax.front()==y){
                    dmax.pop_front();
                }
                if (j>=y){
                    if (maxim[i][dmax.front()]-minim[i][dmin.front()]<sol){
                        sol=maxim[i][dmax.front()]-minim[i][dmin.front()];
                        ap=1;
                    }
                    else if (maxim[i][dmax.front()]-minim[i][dmin.front()]==sol){
                        ap++;
                    }
                }
            }
            dmin.clear();
            dmax.clear();
        }
        swap(x, y);
        if (x!=y) {
            for (int j = 1; j <= m; j++) {
                dmin.push_back(1);
                dmax.push_back(1);
                for (int i = 2; i <= n; i++) {
                    while (!dmin.empty() && v[i][j] <= v[dmin.back()][j]) {
                        dmin.pop_back();
                    }
                    dmin.push_back(i);
                    if (i - dmin.front() == x) {
                        dmin.pop_front();
                    }
                    if (i >= x) {
                        minim[i][j] = v[dmin.front()][j];
                    }
                    while (!dmax.empty() && v[i][j] >= v[dmax.back()][j]) {
                        dmax.pop_back();
                    }
                    dmax.push_back(i);
                    if (i - dmax.front() == x) {
                        dmax.pop_front();
                    }
                    if (i >= x) {
                        maxim[i][j] = v[dmax.front()][j];
                    }
                }
                dmin.clear();
                dmax.clear();
            }
            for (int i = x; i <= n; i++) {
                dmin.push_back(1);
                dmax.push_back(1);
                for (int j = 2; j <= m; j++) {
                    while (!dmin.empty() && minim[i][j] < minim[i][dmin.back()]) {
                        dmin.pop_back();
                    }
                    dmin.push_back(j);
                    if (j - dmin.front() == y) {
                        dmin.pop_front();
                    }
                    while (!dmax.empty() && maxim[i][j] > maxim[i][dmax.back()]) {
                        dmax.pop_back();
                    }
                    dmax.push_back(j);
                    if (j - dmax.front() == y) {
                        dmax.pop_front();
                    }
                    if (j >= y) {
                        if (maxim[i][dmax.front()] - minim[i][dmin.front()] < sol) {
                            sol = maxim[i][dmax.front()] - minim[i][dmin.front()];
                            ap = 1;
                        } else if (maxim[i][dmax.front()] - minim[i][dmin.front()] == sol) {
                            ap++;
                        }
                    }
                }
                dmin.clear();
                dmax.clear();
            }
        }
        fout<<sol<<" "<<ap<<"\n";
    }
    return 0;
}