Cod sursa(job #2514654)

Utilizator SoranaAureliaCatrina Sorana SoranaAurelia Data 26 decembrie 2019 16:14:54
Problema Struti Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <fstream>
#include <deque>
#include <climits>

#define MMAX 1005
#define NMAX 1005
using namespace std;

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

int n, m, p;
int a[NMAX][MMAX], matmin[NMAX][MMAX], matmax[NMAX][MMAX];
int dx, dy;
int difmin = INT_MAX, nr;

deque <int> minim;
deque <int> maxim;

void citire(){
    f>>n>>m>>p;
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            f>>a[i][j];
}

void adaug_in_minim(int i, int j){

    while(!minim.empty() && minim.back()>a[i][j])
        minim.pop_back();
    minim.push_back(a[i][j]);
}

void adaug_in_maxim(int i, int j){
    while(!maxim.empty() && maxim.back()<a[i][j])
        maxim.pop_back();
    maxim.push_back(a[i][j]);
}

void adaug_in_minim_nou(int i, int j){
    while(!minim.empty() && minim.back()>matmin[i][j])
        minim.pop_back();
    minim.push_back(matmin[i][j]);
}
void adaug_in_maxim_nou(int i, int j){
    while(!maxim.empty() && maxim.back()<matmax[i][j])
        maxim.pop_back();
    maxim.push_back(matmax[i][j]);
}

void elimin(int i, int j){
    if(!maxim.empty() && maxim.front() == a[i][j-dy+1])
        maxim.pop_front();
    if(!minim.empty() && minim.front() == a[i][j-dy+1])
        minim.pop_front();
}

void elimin_nou(int i, int j){
    if(!maxim.empty() && maxim.front() == matmax[i-dx+1][j])
        maxim.pop_front();
    if(!minim.empty() && minim.front() == matmin[i-dx+1][j])
        minim.pop_front();
}
void solve(){
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            adaug_in_minim(i, j);
            adaug_in_maxim(i, j);
            if(j>=dy-1){
                matmin[i][j-dy+1]=minim.front();
                matmax[i][j-dy+1]=maxim.front();
                elimin(i, j);
            }
        }
        minim.clear();
        maxim.clear();

    }


    for(int j=0; j<m-dy+1; j++){
        for(int i=0; i<n; i++){
            adaug_in_minim_nou(i, j);
            adaug_in_maxim_nou(i, j);
            if(i>=dx-1){
                int dif = maxim.front() - minim.front();
                if(dif<difmin){
                    difmin = dif;
                    nr=1;
                }
                else if(dif == difmin)
                    nr++;
                elimin_nou(i, j);
            }
        }
        minim.clear();
        maxim.clear();
    }
}
int main()
{
    citire();
    for(int i=0; i<p; i++)
    {
        difmin = INT_MAX;
        nr=0;
        f>>dx>>dy;
        solve();
        if(dx!=dy){
            swap(dx, dy);
            solve();
        }
        g<<difmin<<" "<<nr<<'\n';
    }
    return 0;
}