Pagini recente » Cod sursa (job #2340046) | Cod sursa (job #60212) | Cod sursa (job #1700084) | Cod sursa (job #2858351) | Cod sursa (job #47461)
Cod sursa(job #47461)
#include <stdio.h>
#define nm 1024
int n, m, p, sol, nr, mat[nm][nm], max1[nm][nm], max2[nm][nm], min1[nm][nm], min2[nm][nm];
void f(int, int);
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
int i, j, a, b, test;
scanf("%d%d%d", &n, &m, &p);
for(i = 1; i <= n; ++i)
{
for(j = 1; j <= m; ++j)
{
scanf("%d", &mat[i][j]);
}
}
for(test = 0; test < p; ++test)
{
sol = 8001;
scanf("%d%d", &a, &b);
f(a, b);
if(a != b)
f(b, a);
/*
for(i = 1; i <= n; ++i)
{
for(j = 1; j <= m; ++j)
{
printf("%d ", max2[i][j]);
}
printf("\n");
}
*/
printf("%d %d\n", sol, nr);
}
return 0;
}
void f(int dx, int dy)
{
int st[nm], i, first, last, j;
for(i = 1; i <= n; ++i)
{
first = 1;
last = 0;
for(j = 1; j <= dx; ++j)
{
while(mat[i][st[last]] < mat[i][j] && last >= first)
--last;
st[++last] = j;
}
max1[i][1] = mat[i][st[first]];
for(j = dx + 1; j <= m; ++j)
{
if(j - st[first] >= dx)
++first;
while(mat[i][j] > mat[i][st[last]] && last >= first)
--last;
st[++last] = j;
max1[i][j - dx + 1] = mat[i][st[first]];
}
for(j = 0; j <= m; ++j)
{
st[j] = 0;
}
}
for(i = 1; i <= m - dx + 1; ++i)
{
first = 1;
last = 0;
for(j = 1; j <= dy; ++j)
{
while(max1[j][i] > max1[st[last]][i] && last >= first)
--last;
st[++last] = j;
}
max2[1][i] = max1[st[first]][i];
for(j = dy + 1; j <= n; ++j)
{
if(j - st[first] >= dy)
++first;
while(max1[j][i] > max1[st[last]][i] && last >= first)
--last;
st[++last] = j;
max2[j - dy + 1][i] = max1[st[first]][i];
}
for(j = 0; j <= n; ++j)
st[j] = 0;
}
for(i = 1; i <= n; ++i)
{
first = 1;
last = 0;
for(j = 1; j <= dx; ++j)
{
while(mat[i][st[last]] > mat[i][j] && last >= first)
--last;
st[++last] = j;
}
min1[i][1] = mat[i][st[first]];
for(j = dx + 1; j <= m; ++j)
{
if(j - st[first] >= dx)
++first;
while(mat[i][j] < mat[i][st[last]] && last >= first)
--last;
st[++last] = j;
min1[i][j - dx + 1] = mat[i][st[first]];
}
for(j = 0; j <= m; ++j)
{
st[j] = 0;
}
}
for(i = 1; i <= m - dx + 1; ++i)
{
first = 1;
last = 0;
for(j = 1; j <= dy; ++j)
{
while(min1[j][i] < min1[st[last]][i] && last >= first)
--last;
st[++last] = j;
}
min2[1][i] = min1[st[first]][i];
for(j = dy + 1; j <= n; ++j)
{
if(j - st[first] >= dy)
++first;
while(min1[j][i] < min1[st[last]][i] && last >= first)
--last;
st[++last] = j;
min2[j - dy + 1][i] = min1[st[first]][i];
}
for(j = 0; j <= n; ++j)
st[j] = 0;
}
for(i = 1; i <= n - dy + 1; ++i)
{
for(j = 1; j <= m - dx + 1; ++j)
{
if(max2[i][j] - min2[i][j] == sol)
++nr;
if(max2[i][j] - min2[i][j] < sol)
{
sol = max2[i][j] - min2[i][j];
nr = 1;
}
}
}
}