Cod sursa(job #2479952)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 24 octombrie 2019 18:24:37
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.27 kb
#include <bits/stdc++.h>

#define MAX 2000

using namespace std;

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

int M, N, P, minDif, minDifCount,matrix[MAX][MAX],minRow[MAX][MAX],maxRow[MAX][MAX],minMatrix[MAX][MAX],maxMatrix[MAX][MAX];

void zero(){
    for(int i=1;i<=M;++i){
        for(int j=1;j<=N;++j) minRow[i][j]=maxRow[i][j]=minMatrix[i][j]=maxMatrix[i][j];
    }
}

void makeMinRow(int col){
    for (int i = 1; i <= M; ++i) {
        deque<int> tmp;
        for (int j = 1; j <= N; ++j) {
            while (!tmp.empty() && matrix[i][tmp.back()] >= matrix[i][j]) tmp.pop_back();
            tmp.push_back(j);

            if (tmp.back() - tmp.front() >= col) tmp.pop_front();

            if (j >= col) minRow[i][j] = matrix[i][tmp.front()];
        }
    }
}

void makeMaxRow(int col){
    for (int i = 1; i <= M; ++i) {
        deque<int> tmp;
        for (int j = 1; j <= N; ++j) {
            while (!tmp.empty() && matrix[i][tmp.back()] <= matrix[i][j]) tmp.pop_back();
            tmp.push_back(j);

            if (tmp.back() - tmp.front() >= col) tmp.pop_front();

            if (j >= col) maxRow[i][j] = matrix[i][tmp.front()];
        }
    }
}

void makeMinMat(int row,int col){
    for (int j = col; j <= N; ++j) {
        deque<int> tmp;
        for (int i = 1; i <= M; ++i) {
            while (!tmp.empty() && minRow[tmp.back()][j] >= minRow[i][j]) tmp.pop_back();
            tmp.push_back(i);

            if (tmp.back() - tmp.front() >= row) tmp.pop_front();

            if (i >= row) minMatrix[i][j] = minRow[tmp.front()][j];
        }
    }
}

void makeMaxMat(int row,int col){
    for (int j = col; j <= N; ++j) {
        deque<int> tmp;
        for (int i = 1; i <= M; ++i) {
            while (!tmp.empty() && maxRow[tmp.back()][j] <= maxRow[i][j]) tmp.pop_back();
            tmp.push_back(i);

            if (tmp.back() - tmp.front() >= row) tmp.pop_front();

            if (i >= row) maxMatrix[i][j] = maxRow[tmp.front()][j];
        }
    }
}

void verify(int mat[MAX][MAX]){
    for(int i=1;i<=M;++i){
        for(int j=1;j<=N;++j) cout<<mat[i][j]<<" ";
        cout<<"\n";
    }
    cout<<"____________\n";
}

void plsWork(int row, int col) {
    zero();
    makeMinRow(col);
    makeMaxRow(col);
    makeMinMat(row,col);
    makeMaxMat(row,col);
    for (int i = row; i <= M; ++i)
    {
        for (int j = col; j <= N; ++j){
            if (maxMatrix[i][j] - minMatrix[i][j] == minDif) minDifCount++;
            else if (maxMatrix[i][j] - minMatrix[i][j] < minDif) {
                minDif = maxMatrix[i][j] - minMatrix[i][j];
                minDifCount = 1;
            }
        }
    }


}

void read() {
    ios_base::sync_with_stdio(false);
    INPUT_FILE.tie(NULL);
    OUTPUT_FILE.tie(NULL);

    INPUT_FILE >> M >> N >> P;

    for (int i = 1; i <= M; ++i){
        for (int j = 1; j <= N; ++j) INPUT_FILE >> matrix[i][j];
    }

    int dx, dy;

    for (int i = 1; i <= P; ++i) {
        minDif = INT_MAX;
        minDifCount = 0;
        INPUT_FILE >> dx >> dy;
        plsWork(dx, dy);
        if (dx != dy) plsWork(dy, dx);
        OUTPUT_FILE << minDif << " "<< minDifCount << '\n';
    }
}

int main() {
    read();

    return 0;
}