Pagini recente » Cod sursa (job #2222005) | Cod sursa (job #1619337) | Cod sursa (job #2959078) | Cod sursa (job #2336990) | Cod sursa (job #255732)
Cod sursa(job #255732)
# include <cstdio>
# define FIN "struti.in"
# define FOUT "struti.out"
# define MAXN 1005
int N, M, P, DX, DY, Sol1, Sol2;
int X[MAXN];
int Deque[MAXN];
int A[MAXN][MAXN];
int MN[MAXN][MAXN];
int MX[MAXN][MAXN];
void BST(int DX, int DY)
{
for (int i = DX; i <= N; ++i)
for (int j = DY; j <= M; ++j)
{
if (MX[i][j] - MN[i][j] == Sol1) Sol2++;
if (MX[i][j] - MN[i][j] < Sol1)
{
Sol1 = MX[i][j] - MN[i][j];
Sol2 = 1;
}
}
}
void compute(int DX, int DY)
{
int i, j, begin, end;
for (i = 1; i <= N; ++i)
{
begin = 1; end = 0;
for (j = 1; j <= M; ++j)
{
for (; begin <= end && X[end] < A[i][j]; --end);
Deque[++end] = j;
X[end] = A[i][j];
if (Deque[begin] < j - DY + 1) ++begin;
MX[i][j] = X[begin];
}
}
for (i = 1; i <= M; ++i)
{
begin = 1; end = 0;
for (j = 1; j <= N; ++j)
{
for (; begin <= end && X[end] < MX[j][i]; --end);
Deque[++end] = j;
X[end] = MX[j][i];
if (Deque[begin] < j - DX + 1) ++begin;
MX[j][i] = X[begin];
}
}
for (i = 1; i <= N; ++i)
{
begin = 1; end = 0;
for (j = 1; j <= M; ++j)
{
for (; begin <= end && X[end] > A[i][j]; --end);
Deque[++end] = j;
X[end] = A[i][j];
if (Deque[begin] < j - DY + 1) ++begin;
MN[i][j] = X[begin];
}
}
for (i = 1; i <= M; ++i)
{
begin = 1; end = 0;
for (j = 1; j <= N; ++j)
{
for (; begin <= end && X[end] > MN[j][i]; --end);
Deque[++end] = j;
X[end] = MN[j][i];
if (Deque[begin] < j - DX + 1) ++begin;
MN[j][i] = X[begin];
}
}
}
int main()
{
freopen(FIN,"r",stdin);
freopen(FOUT,"w",stdout);
scanf("%d%d%d",&N,&M,&P);
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= M; ++j)
scanf("%d",&A[i][j]);
for (int i = 1; i <= P; ++i)
{
scanf("%d%d",&DX,&DY);
Sol1 = 10000; Sol2 = 0;
compute(DX, DY); BST(DX, DY);
if (DX != DY)
compute(DY, DX), BST(DY, DX);
printf("%d %d\n",Sol1,Sol2);
}
return 0;
}