Pagini recente » Cod sursa (job #1175153) | Cod sursa (job #2752095) | Cod sursa (job #1427058) | Cod sursa (job #1296742) | Cod sursa (job #2091272)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e3;
int mat[MAXN][MAXN], mn[MAXN][MAXN], mx[MAXN][MAXN], deqmn[MAXN], deqmx[MAXN];
pair <int, int> diff_min(int h, int w, int n, int m) {
int bmx, emx, bmn, emn, ans = INT_MAX, nr = 0;
for (int i = 0; i < n; ++i) {
bmx = bmn = 0; emx = emn = -1;
for (int j = 0; j < m; ++j) {
if (bmx <= emx && deqmx[bmx] == j - w)
++bmx;
if (bmn <= emn && deqmn[bmn] == j - w)
++bmn;
while (bmx <= emx && mat[i][j] > mat[i][deqmx[emx]])
--emx;
while (bmn <= emn && mat[i][j] < mat[i][deqmn[emn]])
--emn;
deqmx[++emx] = j;
deqmn[++emn] = j;
mx[i][j] = mat[i][deqmx[bmx]];
mn[i][j] = mat[i][deqmn[bmn]];
}
}
for (int j = 0; j < m; ++j) {
bmx = bmn = 0; emx = emn = -1;
for (int i = 0; i < n; ++i) {
if (bmx <= emx && deqmx[bmx] == i - h)
++bmx;
if (bmn <= emn && deqmn[bmn] == i - h)
++bmn;
while (bmx <= emx && mx[i][j] > mx[deqmx[emx]][j])
--emx;
while (bmn <= emn && mn[i][j] < mn[deqmn[emn]][j])
--emn;
deqmx[++emx] = i;
deqmn[++emn] = i;
if (i > h - 2 && j > w - 2) {
if (ans > mx[deqmx[bmx]][j] - mn[deqmn[bmn]][j]) {
ans = mx[deqmx[bmx]][j] - mn[deqmn[bmn]][j];
nr = 1;
} else if (ans == mx[deqmx[bmx]][j] - mn[deqmn[bmn]][j])
++nr;
}
}
}
return {ans, nr};
}
int main()
{
int n, m, p;
ifstream fin("struti.in");
fin >> n >> m >> p;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
fin >> mat[i][j];
ofstream fout("struti.out");
for (int i = 0; i < p; ++i) {
int x, y;
fin >> x >> y;
auto a1 = diff_min(x, y, n, m), a2 = diff_min(y, x, n, m);
if (x == y)
y = -a1.first;
else
y = 0;
x = min(a1.first, a2.first);
if (a1.first == x)
y += a1.second;
if (a2.first == x)
y += a2.second;
fout << x << " " << y << '\n';
}
fin.close();
fout.close();
return 0;
}