Cod sursa(job #175198)

Utilizator DorinOltean Dorin Dorin Data 9 aprilie 2008 18:01:14
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
# include <stdio.h>

# define input "struti.in"
# define output "struti.out"

# define INF 10001
# define max 1001

int a[max][max],i,j,n,m,k,x,y;
int e[max][max],ma[max][max],v[max][max],mi[max][max];
int res, nr;

struct coada
{
       int pos,val;
}q[max];

void det(int x, int y)
{
     int prim,ultim;
     for ( i = 1; i<=n;i++)
     {
         ultim = 0;
         prim = 1;
        for( j = 1; j<= m; j++)
        {
             while( prim <= ultim && q[prim].pos <= j-y ) prim++;
			 while( prim <= ultim && q[ultim].val <= a[i][j]) ultim--;
			 q[++ultim].pos = j;
			 q[ultim].val = a[i][j];
			 e[i][j] = q[prim].val;
		}
	 }
	 for ( j = y; j<= m; j++)
	 {
		 prim = 1;
		 ultim = 0;
		 for( i = 1; i <= n; i++)
		 {
			  while( prim <= ultim && q[prim].pos <= i-x)	prim ++;
			  while( prim <= ultim && q[ultim].val <= e[i][j]) ultim --;
			  q[++ultim].pos = i;
			  q[ultim].val = e[i][j];
			  ma[i][j] = q[prim].val;
		 }
	 }


	 for ( i = 1; i<=n;i++)
	 {
		 ultim = 0;
		 prim = 1;
		for( j = 1; j<= m; j++)
		{
			 while( prim <= ultim && q[prim].pos <= j-y ) prim++;
			 while( prim <= ultim && q[ultim].val >= a[i][j]) ultim--;
			 q[++ultim].pos = j;
			 q[ultim].val = a[i][j];
			 v[i][j] = q[prim].val;
		}
	 }
	 for ( j = y; j<= m; j++)
	 {
		 prim = 1;
		 ultim = 0;
         for( i = 1; i <= n; i++)
         {
              while( prim <= ultim && q[prim].pos <= i-x) prim ++;
			  while( prim <= ultim && q[ultim].val >= v[i][j]) ultim --;
              q[++ultim].pos = i;
              q[ultim].val = v[i][j];
              mi[i][j] = q[prim].val;
         }         
     }
     
     for( i= x;i<=n;i ++)
		 for(j = y; j<=m;j++)
         {
               if(ma[i][j] - mi[i][j] < res)
                   res = ma[i][j] - mi[i][j],nr = 0;
               if(ma[i][j] - mi[i][j] == res)
                   nr++;
         }
     
}

int main()
{
    freopen( input, "r", stdin);
    freopen ( output, "w", stdout);
    
    scanf("%d%d%d",&n,&m, &k);
    
    for(i = 1; i<= n;i ++)
       for(j = 1; j<= m; j++)
             scanf("%d",&a[i][j]);
    
    while(k--)
    {
		scanf("%d%d",&x,&y);

		nr = 0;
		res = INF;

		det(x,y);
        if(x != y)
             det(y,x);      
             
        printf("%d %d\n",res, nr);
    }
    
    return 0;
}