Pagini recente » Cod sursa (job #1890460) | Cod sursa (job #117937) | Cod sursa (job #2590673) | Cod sursa (job #1173254) | Cod sursa (job #175148)
Cod sursa(job #175148)
# 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[prim].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[prim].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<=n;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;
}