Pagini recente » Cod sursa (job #1754730) | Cod sursa (job #2609916) | Cod sursa (job #981358) | Cod sursa (job #1758520) | Cod sursa (job #238300)
Cod sursa(job #238300)
#include <stdio.h>
#include <algorithm>
#define mx 1024
using namespace std;
struct coord
{
short x, y;
};
short cdqmm[mx][mx], cdqmn[mx][mx];
int n, m, p, soll, solc, x, y, lx, ly;
short stmm, stmn, ctmm, ctmn;
short alt[mx][mx];
inline void cauta()
{
coord dqmm[mx], dqmn[mx];
short cctmm[mx], cctmn[mx], cstmm[mx], cstmn[mx];
for (int i = 1 ; i <= m; i++)
{
cstmm[i] = cstmn[i] = 1;
cctmm[i] = cctmn[i] = 0;
}
for (int i = 1; i <= n; i++)
{
ctmm = ctmn = 0;
stmm = stmn = 1;
for (int j = 1; j <= m; j++)
{
cdqmm[j][++cctmm[j]] = cdqmn[j][++cctmn[j]] = i;
// update deque pe coloane
for (; cctmm[j] > cstmm[j]
&& alt[cdqmm[j][cctmm[j]]][j] > alt[cdqmm[j][cctmm[j] - 1]][j];
cctmm[j]--)
swap(cdqmm[j][cctmm[j]], cdqmm[j][cctmm[j] - 1]);
if (cdqmm[j][cstmm[j]] < i + 1 - lx)
cstmm[j]++;
for (; cctmn[j] > cstmn[j]
&& alt[cdqmn[j][cctmn[j]]][j] < alt[cdqmn[j][cctmn[j] - 1]][j];
cctmn[j]--)
swap(cdqmn[j][cctmn[j]], cdqmn[j][cctmn[j] - 1]);
if (cdqmn[j][cstmn[j]] < i + 1 - lx)
cstmn[j]++;
// update deque pe dreptunghi
dqmm[++ctmm].x = cdqmm[j][cstmm[j]];
dqmn[++ctmn].x = cdqmn[j][cstmn[j]];
dqmm[ctmm].y = dqmn[ctmn].y = j;
for (; ctmm > stmm && alt[dqmm[ctmm].x][dqmm[ctmm].y] > alt[dqmm[ctmm - 1].x][dqmm[ctmm - 1].y]; ctmm--)
swap(dqmm[ctmm], dqmm[ctmm - 1]);
if (dqmm[stmm].x < i + 1 - lx || dqmm[stmm].y < j + 1 - ly)
stmm++;
for (; ctmn > stmn && alt[dqmn[ctmn].x][dqmn[ctmn].y] < alt[dqmn[ctmn - 1].x][dqmn[ctmn - 1].y]; ctmn--)
swap(dqmn[ctmn], dqmn[ctmn - 1]);
if (dqmn[stmn].x < i + 1 - lx || dqmn[stmn].y < j + 1 - ly)
stmn++;
int l = alt[dqmm[stmm].x][dqmm[stmm].y] - alt[dqmn[stmn].x][dqmn[stmn].y];
if (i < lx || j < ly)
continue;
if (l < soll)
{
soll = l;
solc = 0;
}
if (l == soll)
solc++;
}
}
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","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", &alt[i][j]);
for (; p; p--)
{
scanf("%d %d", &x, &y);
soll = LONG_MAX;
solc = 0;
lx = x, ly = y;
cauta();
if (x != y)
{
swap(lx, ly);
cauta();
}
printf("%d %d\n", soll, solc);
}
fclose(stdin);
fclose(stdout);
return 0;
}