Cod sursa(job #2756089)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 29 mai 2021 16:55:54
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.84 kb
#include <bits/stdc++.h>

using namespace std;

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

const int nmax = 1005;
int n, m, p, mat[nmax][nmax], maxx[nmax][nmax], minn[nmax][nmax], minim, cnt;
deque <int> d, d2;

void Solve(int x, int y){
    for (int j = 1; j <= m; ++j){
        d.clear();
        d2.clear();
        for (int i = 1; i <= x; ++i){
            while (d.size() > 0 && mat[i][j] > mat[d.back()][j]) d.pop_back();
            while (d2.size() > 0 && mat[i][j] < mat[d2.back()][j]) d2.pop_back();
            d.push_back(i);
            d2.push_back(i);
        }
        maxx[1][j] = mat[d.front()][j];
        minn[1][j] = mat[d2.front()][j];
        for (int i = x + 1; i <= n; ++i){
            if (d.front() == i - x) d.pop_front();
            if (d2.front() == i - x) d2.pop_front();
            while (d.size() > 0 && mat[i][j] > mat[d.back()][j]) d.pop_back();
            while (d2.size() > 0 && mat[i][j] < mat[d2.back()][j]) d2.pop_back();
            d.push_back(i);
            d2.push_back(i);
            maxx[i - x + 1][j] = mat[d.front()][j];
            minn[i - x + 1][j] = mat[d2.front()][j];
        }
    }
    for (int i = 1; i <= n - x + 1; ++i){
        d.clear();
        d2.clear();
        for (int j = 1; j <= y; ++j){
            while (d.size() > 0 && maxx[i][j] > maxx[i][d.back()]) d.pop_back();
            while (d2.size() > 0 && minn[i][j] < minn[i][d2.back()]) d2.pop_back();
            d.push_back(j);
            d2.push_back(j);
        }
        int diff = maxx[i][d.front()] - minn[i][d2.front()];
        if (diff < minim){
            minim = diff;
            cnt = 1;
        }
        else if (diff == minim){
            ++cnt;
        }
        for (int j = y + 1; j <= m; ++j){
            if (d.front() == j - y) d.pop_front();
            if (d2.front() == j - y) d2.pop_front();
            while (d.size() > 0 && maxx[i][j] > maxx[i][d.back()]) d.pop_back();
            while (d2.size() > 0 && minn[i][j] < minn[i][d2.back()]) d2.pop_back();
            d.push_back(j);
            d2.push_back(j);
            int diff = maxx[i][d.front()] - minn[i][d2.front()];
            if (diff < minim){
            minim = diff;
            cnt = 1;
            }
            else if (diff == minim){
                ++cnt;
            }
        }
    }
}

int main(){
    fin >> n >> m >> p;
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= m; ++j){
            fin >> mat[i][j];
        }
    }
    while (p--){
        int x, y;
        fin >> x >> y;
        minim = 1e9;
        cnt = 0;
        if (x == y){
            Solve(x, y);
        }
        else{
            Solve(x, y);
            Solve(y, x);
        }
        fout << minim << " " << cnt << "\n";
    }
    fin.close();
    fout.close();
    return 0;
}