Cod sursa(job #241365)

Utilizator katakunaCazacu Alexandru katakuna Data 9 ianuarie 2009 21:58:47
Problema Struti Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.82 kb
#include<stdio.h>
#include<string.h>
#define INF 1<<30

int aux,min,nr,D[1011],P,u,i,dx,dy,t,p,n,m,c[1011][1011],a[1011][1011],A[1011][1011],B[1011][1011],C[1011][1011],j;

void dmin(){

   for(i=1;i<=m;i++){
   p=1;u=0;
   memset(D,0,sizeof(D));

     for(j=1;j<=n;j++){

       while(D[p] <= j-dx && p<=u) p++;
       
       while(p<=u && a[D[u]][i] >= a[j][i]) u--;

       u++; D[u] = j;

       if(j>=dx)
       A[j][i]= a[D[p]][i];

     }

   }
}


void dmax(){

   for(i=1;i<=m;i++){
   p=1;u=0;
   memset(D,0,sizeof(D));

     for(j=1;j<=n;j++){

       while(D[p] <= j-dx && p<=u)  p++;
       
       while(p<=u && a[D[u]][i] <= a[j][i]) u--;

       u++; D[u] = j;

       if(j>=dx)
       A[j][i]= a[D[p]][i];

     }

   }
}


void d2min(){

   for(i=dx;i<=m;i++){
   p=1;u=0;
   memset(D,0,sizeof(D));

     for(j=1;j<=n;j++){

       while(D[p] <= j-dy && p<=u) p++;
       
       while(p<=u && A[i][D[u]] >= A[i][j]) u--;

       u++; D[u] = j;

       if(j>=dy)
       B[i][j]= A[i][D[p]];

     }

   }
}


void d2max(){

   for(i=dx;i<=m;i++){
   p=1;u=0;
   memset(D,0,sizeof(D));

     for(j=1;j<=n;j++){

       while(D[p] <= j-dy && p<=u)
       p++;
       
       while(p<=u && A[i][D[u]] <= A[i][j])
       u--;

       u++;
       D[u] = j;

       if(j>=dy)
       C[i][j]= A[i][D[p]];

     }

   }
}


int main(){

FILE *f=fopen("struti.in","r");
FILE *g=fopen("struti.out","w");
fscanf(f,"%d %d %d",&n,&m,&P);

   for(i=1;i<=n;i++)
     for(j=1;j<=m;j++)
     fscanf(f,"%d",&a[i][j]);

   for(t=1;t<=P;t++){
   fscanf(f,"%d %d",&dx,&dy);
   dmin();
   d2min();
   //treb sa shterg A;
      for(i=dx;i<=n;i++)
      memset(A[i],0,sizeof(A[i]));
   //ramane in B;

   dmax();
   d2max();

   //ramane in C

   min=INF;
   nr=0;

      for(i=dx;i<=n;i++)
        for(j=dy;j<=m;j++){
        c[i][j]=C[i][j] - B[i][j];
          if(c[i][j] == min)
          nr++;
          if(c[i][j]<min){
          min=c[i][j];
          nr=1;
          }
        B[i][j]=A[i][j]=C[i][j]=0;
        }

/////////////////////////////////////////////////////////////////////////////////
     if(dx!=dy){
     aux=dx;
     dx=dy;
     dy=aux;

     dmin();
     d2min();
     //treb sa shterg A;
        for(i=dx;i<=n;i++)
        memset(A[i],0,sizeof(A[i]));
     //ramane in B;

     dmax();
     d2max();

     //ramane in C

        for(i=dx;i<=n;i++)
          for(j=dy;j<=m;j++){
          c[i][j]=C[i][j] - B[i][j];
            if(c[i][j] == min)
            nr++;
            if(c[i][j]<min){
            min=c[i][j];
            nr=1;
            }
          B[i][j]=A[i][j]=C[i][j]=0;
          }
   

     }
   fprintf(g,"%d %d\n",min,nr);
   }

fclose(f);
fclose(g);

return 0;
}