Pagini recente » Cod sursa (job #2006657) | Cod sursa (job #1272640) | Cod sursa (job #1595675) | Cod sursa (job #2389320) | Cod sursa (job #358223)
Cod sursa(job #358223)
#include <algorithm>
#include <stdio.h>
#define MAX 1024
#include <algorithm>
#include <stdio.h>
#define MAX 1024
#define mp make_pair
#define f first
#define s second
using namespace std;
int n, m, p, minGs, sol;
int alt[MAX][MAX];
pair <int, int> matDif[MAX][MAX];
pair <int, int> deqMax[MAX], deqMin[MAX];
inline void test(int lx, int ly)
{
for (int i = 1; i <= n; i++)
{
int deqMinSt = 1, deqMaxSt = 1;
int deqMinFn = 0, deqMaxFn = 0;
for (int j = 1; j <= m; j++)
{
deqMin[++deqMinFn] = deqMax[++deqMaxFn] = mp(alt[i][j], j);
for (; deqMinSt != deqMinFn && deqMin[deqMinFn].f < deqMin[deqMinFn - 1].f; deqMinFn--)
swap(deqMin[deqMinFn], deqMin[deqMinFn - 1]);
if (deqMin[deqMinSt].s <= j - ly)
deqMinSt++;
for (; deqMaxSt != deqMaxFn && deqMax[deqMaxFn].f > deqMax[deqMaxFn - 1].f; deqMaxFn--)
swap(deqMax[deqMaxFn], deqMax[deqMaxFn - 1]);
if (deqMax[deqMaxSt].s <= j - ly)
deqMaxSt++;
matDif[i][j] = mp(deqMax[deqMaxSt].f, deqMin[deqMinSt].f);
}
}
for (int j = ly; j <= m; j++)
{
int deqMinSt = 1, deqMaxSt = 1;
int deqMinFn = 0, deqMaxFn = 0;
for (int i = 1; i <= n; i++)
{
deqMax[++deqMaxFn] = mp(matDif[i][j].f, i);
deqMin[++deqMinFn] = mp(matDif[i][j].s, i);
for (; deqMinSt != deqMinFn && deqMin[deqMinFn].f < deqMin[deqMinFn - 1].f; deqMinFn--)
swap(deqMin[deqMinFn], deqMin[deqMinFn - 1]);
if (deqMin[deqMinSt].s <= i - lx)
deqMinSt++;
for (; deqMaxSt != deqMaxFn && deqMax[deqMaxFn].f > deqMax[deqMaxFn - 1].f; deqMaxFn--)
swap(deqMax[deqMaxFn], deqMax[deqMaxFn - 1]);
if (deqMax[deqMaxSt].s <= i - lx)
deqMaxSt++;
if (i >= lx)
{
if (deqMax[deqMaxSt].f - deqMin[deqMinSt].f < minGs)
minGs = deqMax[deqMaxSt].f - deqMin[deqMinSt].f, sol = 0;
if (deqMax[deqMaxSt].f - deqMin[deqMinSt].f == minGs)
sol++;
}
}
}
}
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--)
{
minGs = sol = LONG_MAX;
int dx, dy;
scanf("%d %d", &dx, &dy);
test(dx, dy);
if (dx != dy)
test(dy, dx);
printf("%d %d\n", minGs, sol);
}
fclose(stdin);
fclose(stdout);
return 0;
}