Cod sursa(job #2068428)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 17 noiembrie 2017 20:48:51
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.6 kb
#include <fstream>
#define DIM 1001
using namespace std;

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

int n,m,t,i,j,minim,ap,dx,dy;
int a[DIM][DIM],dmin[DIM][DIM],dmax[DIM][DIM],cmin[DIM][DIM],cmax[DIM][DIM],d[DIM];

int deque_ (int dx,int dy){
    /// dmin[i][j] - minimul secventei de pe linia i, care incepe la pozitia j si are lungimea dy
    for (int i=1;i<=n;i++){
        d[1] = 1;
        int p = 1;
        int u = 1;
        for (int j=2;j<=m;j++){
            while (p<=u && a[i][j] <= a[i][d[u]])
                u--;
            d[++u] = j;
            if (j-d[p] == dy)
                p++;
            if (j >= dy)
                dmin[i][j-dy+1] = a[i][d[p]];
        }
    }
    /// facem acelasi lucru, doar ca avem dmax
    for (int i=1;i<=n;i++){
        d[1] = 1;
        int p = 1;
        int u = 1;
        for (int j=2;j<=m;j++){
            while (p<=u && a[i][j] >= a[i][d[u]])
                u--;
            d[++u] = j;
            if (j-d[p] == dy)
                p++;
            if (j >= dy)
                dmax[i][j-dy+1] = a[i][d[p]];
        }
    }
    /// facem pentru coloane minim
    for (int j=1;j<=m-dy+1;j++){
        int p = 1;
        int u = 1;
        d[1] = 1;
        for (int i=2;i<=n;i++){
            while (p<=u && dmin[i][j] <= dmin[d[u]][j])
                u--;
            d[++u] = i;
            if (i-d[p] == dx)
                p++;
            if (i >= dx)
                cmin[i-dx+1][j] = dmin[d[p]][j];
        }
    }
    /// facem pentru coloane maxim
    for (int j=1;j<=m-dy+1;j++){
        int p = 1;
        int u = 1;
        d[1] = 1;
        for (int i=2;i<=n;i++){
            while (p<=u && dmax[i][j] >= dmax[d[u]][j])
                u--;
            d[++u] = i;
            if (i-d[p] == dx)
                p++;
            if (i >= dx)
                cmax[i-dx+1][j] = dmax[d[p]][j];
        }
    }


    for (int i=1;i<=n-dx+1;i++)
        for (int j=1;j<=m-dy+1;j++){
            if (cmax[i][j] - cmin[i][j] < minim){
                minim = cmax[i][j] - cmin[i][j];
                ap = 1;
            }
            else{
                if (cmax[i][j] - cmin[i][j] == minim)
                    ap++;
            }
        }

}

int main (){

    fin>>n>>m>>t;
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
            fin>>a[i][j];
    for (;t--;){
        fin>>dx>>dy;
        minim = 1000000000;
        ap = 0;
        deque_ (dx,dy);
        if (dx != dy)
            deque_ (dy,dx);
        fout<<minim<<" "<<ap<<"\n";

    }

    return 0;
}