Cod sursa(job #1394692)

Utilizator rughibemBelcineanu Alexandru Ioan rughibem Data 20 martie 2015 16:18:48
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include<stdio.h>
#define DIM 1005
#define INF 9000
FILE *f=fopen("struti.in","r"), *g=fopen("struti.out","w");

struct Coada{ long int ind, nr; } Qmin[DIM], Qmax[DIM], NOU;

long int N, M, T, t, MIN, NR, dx, dy, dif;
long int a[DIM][DIM], Dmin[DIM][DIM], Dmax[DIM][DIM];

void Citire(){
long int i, j;

    fscanf(f,"%ld %ld %ld\n",&N,&M,&T);
    for(i=1;i<=N;i++)
        for(j=1;j<=M;j++)
            fscanf(f,"%ld",&a[i][j]);
}

void Verifica( long int minim, long int maxim ){

    dif = maxim - minim;

    if( dif < MIN ){ MIN = dif; NR = 1; }
    else if( dif == MIN ) NR++;

}

void Rezolva( long int DX, long int DY ){
long int i, j, pm, um, pM, uM, x;

    for(i=1;i<=N;i++){

        pm = 0; um = -1;
        pM = 0; uM = -1;
        for(j=1;j<=M;j++){

            x = a[i][j];
            while( pm <= um && Qmin[um].nr > x ) um --;
            NOU.ind = j; NOU.nr = x; Qmin[++um] = NOU;
            if( Qmin[pm].ind + DY - 1 < j ) pm ++;
            if( j >= DY ) Dmin[i][j] = Qmin[pm].nr;

            while( pM <= uM && Qmax[uM].nr < x ) uM --;
            NOU.ind = j; NOU.nr = x; Qmax[++uM] = NOU;
            if( Qmax[pM].ind + DY - 1 < j ) pM ++;
            if( j >= DY ) Dmax[i][j] = Qmax[pM].nr;

        }

    }

    for(j=DY;j<=M;j++){

        pm = 0; um = -1;
        pM = 0; uM = -1;
        for(i=1;i<=N;i++){

            x = Dmin[i][j];
            while( pm <= um && Qmin[um].nr > x ) um --;
            NOU.ind = i; NOU.nr = x; Qmin[++um] = NOU;
            if( Qmin[pm].ind + DX - 1 < i ) pm ++;

            x = Dmax[i][j];
            while( pM <= uM && Qmax[uM].nr < x ) uM --;
            NOU.ind = i; NOU.nr = x; Qmax[++uM] = NOU;
            if( Qmax[pM].ind + DX - 1 < i ) pM ++;

            if( i >= DX ) Verifica( Qmin[pm].nr, Qmax[pM].nr );

        }

    }

}

int main(){

    Citire();
    for(t=1;t<=T;t++){

        fscanf(f,"%ld %ld\n",&dx,&dy);
        MIN = INF; NR = 0;
        Rezolva(dx,dy);
        if( dx != dy ) Rezolva(dy,dx);
        fprintf(g,"%ld %ld\n",MIN,NR);

    }

return 0;
}