Pagini recente » Cod sursa (job #2306543) | Istoria paginii runda/oni_10_1 | Cod sursa (job #1773940) | Istoria paginii runda/primuld | Cod sursa (job #1076989)
#include <cstdio>
int N, M, T, rez, cnt;
const int Nmax=1005;
int d_min[Nmax], d_max[Nmax];
int a[Nmax][Nmax], b[Nmax][Nmax], minim[Nmax][Nmax], maxim[Nmax][Nmax], c[1005][1005];
void solve(int X, int Y){
int i, j, p_min, u_min, p_max, u_max;
for (i = 1; i <= N; i++){
p_min = p_max = 1; u_min = u_max = 0;
for (j = 1; j <= M; j++){
while (u_min >= p_min && b[i][j] < b[i][ d_min[u_min] ]) u_min--;
d_min[ ++u_min ] = j;
while (u_max >= p_max && b[i][j] > b[i][ d_max[u_max] ]) u_max--;
d_max[ ++u_max ] = j;
if (d_min[p_min] == j - Y) p_min++;
if (d_max[p_max] == j - Y) p_max++;
if (j >= Y){
minim[i][j - Y + 1] = b[i][ d_min[p_min] ];
maxim[i][j - Y + 1] = b[i][ d_max[p_max] ];
}
}
}
M -= (Y - 1);
for (j = 1; j <= M; j++){
p_min = p_max = 1; u_min = u_max = 0;
for (i = 1; i <= N; i++){
while (u_min >= p_min && minim[i][j] < minim[ d_min[u_min] ][j]) u_min--;
d_min[ ++u_min ] = i;
while (u_max >= p_max && maxim[i][j] > maxim[ d_max[u_max] ][j]) u_max--;
d_max[ ++u_max ] = i;
if (d_min[p_min] == i - X) p_min++;
if (d_max[p_max] == i - X) p_max++;
if (i >= X) c[i - X + 1][j] = maxim[ d_max[p_max] ][j] - minim[d_min[p_min] ][j];
}
}
N -= (X - 1);
for (i = 1; i <= N; i++)
for (j = 1; j <= M; j++){
if (c[i][j] < rez) rez = c[i][j], cnt = 1;
else if (c[i][j] == rez) cnt++;
}
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
int i, j, X, Y, MM, NN;
scanf("%d %d %d",&N,&M,&T);
NN = N; MM = M;
for (i = 1; i <= N; i++)
for (j = 1; j <= M; j++) scanf("%d",&a[i][j]);
while (T--){
for (i = 1; i <= N; i++)
for (j = 1; j <= M; j++) b[i][j] = a[i][j];
scanf("%d %d",&X,&Y);
rez = 200000; cnt = 0;
N = NN; M = MM;
solve(X, Y);
if (X != Y){
N = NN; M = MM;
solve(Y, X);
}
printf("%d %d\n", rez, cnt);
}
return 0;
}