Pagini recente » Cod sursa (job #2173009) | Cod sursa (job #35271) | Cod sursa (job #388158) | Cod sursa (job #3210320) | Cod sursa (job #258225)
Cod sursa(job #258225)
#include <algorithm>
#include <stdio.h>
#include <vector>
#define MAX 1024
#define pb push_back
#define mp make_pair
#define f first
#define s second
using namespace std;
int n, m, p, rez, nrSol, x, y;
int lg[MAX];
short matAlt[MAX][MAX];
short matRminq[MAX][MAX][11], matRmaxq[MAX][MAX][11];
inline void preCalc()
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
matRminq[i][j][0] = matRmaxq[i][j][0] = matAlt[i][j];
for (int lc = 0; lc <= lg[min(n, m)]; lc++)
{
int lg2 = 1 << lc;
for (int i = 1; i <= n - lg2 + 1; i++)
for (int j = 1; j <= m - lg2 + 1; j++)
{
matRminq[i][j][lc + 1] = min(matRminq[i][j][lc], matRminq[i][j + lg2][lc]);
matRmaxq[i][j][lc + 1] = max(matRmaxq[i][j][lc], matRmaxq[i][j + lg2][lc]);
}
}
}
inline void check(short lungX, short lungY)
{
for (int j = 1; j <= m - lungY + 1; j++)
{
vector <pair <short, short> > dqMax, dqMin;
int stDqMax = 1, stDqMin = 1;
dqMax.pb(mp(0, 0)), dqMin.pb(mp(0, 0));
for (int i = 1; i <= n; i++)
{
dqMax.pb(mp(max(matRmaxq[i][j][lg[lungY]], matRmaxq[i][j + lungY - (1 << lg[lungY])][lg[lungY]]), i));
dqMin.pb(mp(min(matRminq[i][j][lg[lungY]], matRminq[i][j + lungY - (1 << lg[lungY])][lg[lungY]]), i));
for (; stDqMax < dqMax.size() - 1 && dqMax[dqMax.size() - 1].f > dqMax[dqMax.size() - 2].f; dqMax.pop_back())
swap(dqMax[dqMax.size() - 1], dqMax[dqMax.size() - 2]);
if (dqMax[stDqMax].s < i + 1 - lungX)
stDqMax++;
for (; stDqMin < dqMin.size() - 1 && dqMin[dqMin.size() - 1].f < dqMin[dqMin.size() - 2].f; dqMin.pop_back())
swap(dqMin[dqMin.size() - 1], dqMin[dqMin.size() - 2]);
if (dqMin[stDqMin].s < i + 1 - lungX)
stDqMin++;
if (i < lungX)
continue;
if (rez > dqMax[stDqMax].f - dqMin[stDqMin].f)
{
rez = dqMax[stDqMax].f - dqMin[stDqMin].f;
nrSol = 0;
}
if (rez == dqMax[stDqMax].f - dqMin[stDqMin].f)
nrSol++;
}
}
}
int main()
{
freopen("struti.in", "r", stdin);
freopen("struti.out", "w", stdout);
for (int i = 2; i < MAX; i++)
lg[i] = lg[i / 2] + 1;
scanf("%d %d %d", &n, &m, &p);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
scanf("%d", &matAlt[i][j]);
preCalc();
for (; p; p--)
{
scanf("%d %d\n", &x, &y);
rez = LONG_MAX, nrSol = 0;
check(x, y);
if (x != y)
check(y, x);
printf("%d %d\n", rez, nrSol);
}
fclose(stdin);
fclose(stdout);
return 0;
}