Pagini recente » Cod sursa (job #932339) | Cod sursa (job #2210386) | Cod sursa (job #2424882) | Cod sursa (job #822323) | Cod sursa (job #47468)
Cod sursa(job #47468)
#include <stdio.h>
#define nm 1024
short int n, m, p, sol, nr, mat[nm][nm], max1[nm][nm], max2[nm][nm], min1[nm][nm], min2[nm][nm];
void f(short int, short int);
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
short int i, j, a, b, test;
scanf("%hd%hd%hd", &n, &m, &p);
for(i = 1; i <= n; ++i)
{
for(j = 1; j <= m; ++j)
{
scanf("%hd", &mat[i][j]);
}
}
for(test = 0; test < p; ++test)
{
sol = 8001;
scanf("%hd%hd", &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("%hd %hd\n", sol, nr);
}
return 0;
}
void f(short int dx, short int dy)
{
short int st[nm], i, first, last, j;
st[0] = 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;
}
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(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(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(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(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;
}
}
}
}