Cod sursa(job #1753625)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 6 septembrie 2016 19:52:27
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
# include <fstream>
# define DIM 1010
# define INF 1000000000
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int v[DIM][DIM],ma[DIM][DIM],mi[DIM][DIM],fma[DIM][DIM];
int fmi[DIM][DIM],d[DIM];
int n,m,pp,i,j,p,u,dx,dy,minim,nr;
void deque(int dx,int dy){
    int i,j;
    for(i=1;i<=n;i++){
        u=0;
        p=1;
        for(j=1;j<=m;j++){
            while(v[i][j]>=v[i][d[u]]&&u>=p)
                u--;
            d[++u]=j;
            if(j-d[p]==dx)
                p++;
            if(j>=dx)
                ma[i][j]=v[i][d[p]];
        }
    }
    for(i=1;i<=n;i++){
        u=0;
        p=1;
        for(j=1;j<=m;j++){
            while(v[i][j]<=v[i][d[u]]&&u>=p)
                u--;
            d[++u]=j;
            if(j-d[p]==dx)
                p++;
            if(j>=dx)
                mi[i][j]=v[i][d[p]];
        }
    }
    for(j=dx;j<=m;j++){
        u=0;
        p=1;
        for(i=1;i<=n;i++){
            while(ma[i][j]>=ma[d[u]][j]&&u>=p)
                u--;
            d[++u]=i;
            if(i-d[p]==dy)
                p++;
            if(i>=dy)
                fma[i][j]=ma[d[p]][j];
        }
    }
    for(j=dx;j<=m;j++){
        u=0;
        p=1;
        for(i=1;i<=n;i++){
            while(mi[i][j]<=mi[d[u]][j]&&u>=p)
                u--;
            d[++u]=i;
            if(i-d[p]==dy)
                p++;
            if(i>=dy)
                fmi[i][j]=mi[d[p]][j];
        }
    }
    for(i=dy;i<=n;i++)
        for(j=dx;j<=m;j++)
            if(minim>fma[i][j]-fmi[i][j]){
                minim=fma[i][j]-fmi[i][j];
                nr=1;
            }
            else
                if(minim==fma[i][j]-fmi[i][j])
                    nr++;
}
int main () {
    fin>>n>>m>>pp;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            fin>>v[i][j];
    for(i=1;i<=pp;i++){
        fin>>dx>>dy;
        minim=INF;
        deque(dx,dy);
        if(dy!=dx)
            deque(dy,dx);
        fout<<minim<<" "<<nr<<"\n";
    }
    return 0;
}