Pagini recente » Cod sursa (job #2466642) | Cod sursa (job #1595295) | Cod sursa (job #1143354) | Cod sursa (job #384965) | Cod sursa (job #2135361)
#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];
inline void check_deq(int deq[], int &b, int e, int lim) {
if (b <= e && deq[b] == lim)
++b;
}
pair <int, int> diff_min(int h, int w, int m, int n) {
int bmx, emx, bmn, emn, ans = INT_MAX, nr = 0;
for (int i = 0; i < m; ++i) {
bmx = bmn = 0; emx = emn = -1;
for (int j = 0; j < n; ++j) {
check_deq(deqmx, bmx, emx, j - w);
check_deq(deqmn, bmn, emn, j - w);
while (bmx <= emx && mat[i][j] > mat[i][deqmx[emx]])
--emx;
while (bmn <= emn && mat[i][j] < mat[i][deqmn[emn]])
--emn;
deqmx[++emx] = deqmn[++emn] = j;
mx[i][j] = mat[i][deqmx[bmx]];
mn[i][j] = mat[i][deqmn[bmn]];
}
}
for (int j = 0; j < n; ++j) {
bmx = bmn = 0; emx = emn = -1;
for (int i = 0; i < m; ++i) {
check_deq(deqmx, bmx, emx, i - h);
check_deq(deqmn, bmn, emn, i - h);
while (bmx <= emx && mx[i][j] > mx[deqmx[emx]][j])
--emx;
while (bmn <= emn && mn[i][j] < mn[deqmn[emn]][j])
--emn;
deqmx[++emx] = 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 >> m >> n >> p;
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++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, m, n), a2 = diff_min(y, x, m, n);
if (x == y) {
x = a1.first;
y = a1.second;
} else {
x = min(a1.first, a2.first);
y = (a1.first == x) * a1.second + (a2.first == x) * a2.second;
}
fout << x << " " << y << '\n';
}
fin.close();
fout.close();
return 0;
}