Pagini recente » Cod sursa (job #1022938) | Cod sursa (job #2455321) | Cod sursa (job #1440040) | Cod sursa (job #1640229) | Cod sursa (job #240846)
Cod sursa(job #240846)
#include<stdio.h>
#define lg 1005
int n, i, j, dx, dy, nrs, rz, A[lg][lg], B[lg][lg][2], m, p;
struct ches{
int x, y;
};
ches q[lg][2];
void find(int X, int Y){
int s1, s2, f1, f2, i, j;
for (i = 1; i <= n; i ++){
s1 = s2 = 1, f1 = f2 = 0;
for (j = 1; j <= m; j ++){
if (s1 < f1 && j - q[s1][0].y + 1 > X)
s1 ++;
while (s1 <= f1 && A[i][j] <= q[f1][0].x)
f1 --;
f1 ++; q[f1][0].x = A[i][j], q[f1][0].y = j;
if (s2 < f2 && j - q[s2][1].y + 1 > X)
s2 ++;
while (s2 <= f2 && A[i][j] >= q[f2][1].x)
f2 --;
f2 ++; q[f2][1].x = A[i][j], q[f2][1].y = j;
if (j >= X){
B[i][j - X + 1][0] = q[s1][0].x;
B[i][j - X + 1][1] = q[s2][1].x;
}
}
}
/*
for (i = 1; i <= n; i ++){
for (j = 1; j <= m; j ++)
printf("%d %d ", B[i][j][0], B[i][j][1]);
printf("\n");
}
*/
for (j = 1; j <= m - X + 1; j ++){
s1 = s2 = 1, f1 = f2 = 0;
for (i = 1; i <= n; i ++){
if (s1 < f1 && i - q[s1][0].y + 1 > Y)
s1 ++;
while (s1 <= f1 && B[i][j][0] <= q[f1][0].x)
f1 --;
f1 ++; q[f1][0].x = B[i][j][0], q[f1][0].y = i;
if (s2 < f2 && i - q[s2][1].y + 1 > Y)
s2 ++;
while (s2 <= f2 && B[i][j][1] >= q[f2][1].x)
f2 --;
f2 ++; q[f2][1].x = B[i][j][1], q[f2][1].y = i;
if (i >= Y){
if (q[s2][1].x - q[s1][0].x < rz){
rz = q[s2][1].x - q[s1][0].x;
nrs = 0;
}
if (q[s2][1].x - q[s1][0].x == rz)
nrs ++;
}
}
}
}
int main()
{
freopen("struti.in", "rt", stdin);
freopen("struti.out", "wt", stdout);
scanf("%d%d%d", &n, &m, &p);
for (i = 1; i <= n; i ++)
for (j = 1; j <= m; j ++)
scanf("%d", &A[i][j]);
while (p --){
scanf("%d%d", &dx, &dy);
rz = 0x3f3f3f3f;
find(dx, dy);
if (dx != dy)
find(dy, dx);
printf("%d %d\n", rz, nrs);
}
return 0;
}