Pagini recente » Cod sursa (job #612709) | Cod sursa (job #2427196) | Cod sursa (job #2379592) | Cod sursa (job #1044382) | Cod sursa (job #257332)
Cod sursa(job #257332)
#include <cstdio>
int N, M, T, rez, cnt;
int d_min[1005], d_max[1005];
int a[1005][1005], b[1005][1005], minim[1005][1005], maxim[1005][1005], 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++)
{
for (j = 1; j <= M; j++) printf("%d ",b[i][j]);
printf("\n");
}
printf("\n");
*/
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 (i = 1; i <= N; i++)
{
for (j = 1; j <= M; j++) printf("%d ",minim[i][j]);
printf("\n");
}
printf("\n");
for (i = 1; i <= N; i++)
{
for (j = 1; j <= M; j++) printf("%d ",maxim[i][j]);
printf("\n");
}
printf("sdagfda\n");
*/
//////////
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++) printf("%d ",c[i][j]);
printf("\n");
}
printf("\n");
*/
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 = (1<<30); 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;
}