Pagini recente » Cod sursa (job #355373) | Cod sursa (job #2479337) | Cod sursa (job #524769) | Cod sursa (job #624586) | Cod sursa (job #1086306)
#include <fstream>
#include <iostream>
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
const int MAX_N = 1005;
int n, m, p, A[MAX_N][MAX_N], B[MAX_N][MAX_N], deque[MAX_N][3], front, back;
int Maxim[MAX_N][MAX_N], Minim[MAX_N][MAX_N];
int ans, ansCount;
void read() {
f >> n >> m >> p;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
f >> A[i][j];
}
void solve (int dx, int dy) {
for (int i = 1; i <= n; i++) {
front = 1; back = 0;
for (int j = 1; j <= m; j++) {
while (A[i][j] >= A[deque[back][0]][deque[back][1]] && front <= back)
back--;
++back;
deque[back][0] = i;
deque[back][1] = j;
if (j - deque[front][1] >= dy)
front++;
if (j >= dy)
B[i][j - dy + 1] = A[deque[front][0]][deque[front][1]];
}
}
for (int j = 1; j <= m - dy + 1; j++) {
front = 1; back = 0;
for (int i = 1; i <= n; i++) {
while (B[i][j] >= B[deque[back][0]][deque[back][1]] && front <= back)
back--;
++back;
deque[back][0] = i;
deque[back][1] = j;
if (i - deque[front][0] >= dx)
front++;
if (i >= dx)
Maxim[i - dx + 1][j] = B[deque[front][0]][deque[front][1]];
}
}
for (int i = 1; i <= n; i++) {
front = 1; back = 0;
for (int j = 1; j <= m; j++) {
while (A[i][j] <= A[deque[back][0]][deque[back][1]] && front <= back)
back--;
++back;
deque[back][0] = i;
deque[back][1] = j;
if (j - deque[front][1] >= dy)
front++;
if (j >= dy)
B[i][j - dy + 1] = A[deque[front][0]][deque[front][1]];
}
}
for (int j = 1; j <= m - dy + 1; j++) {
front = 1; back = 0;
for (int i = 1; i <= n; i++) {
while (B[i][j] <= B[deque[back][0]][deque[back][1]] && front <= back)
back--;
++back;
deque[back][0] = i;
deque[back][1] = j;
if (i - deque[front][0] >= dx)
front++;
if (i >= dx)
Minim[i - dx + 1][j] = B[deque[front][0]][deque[front][1]];
}
}
for (int i = 1; i <= n - dx + 1; i++)
for (int j = 1; j <= m - dy + 1; j++)
if (Maxim[i][j] - Minim[i][j] < ans) {
ans = Maxim[i][j] - Minim[i][j];
ansCount = 1;
} else if (Maxim[i][j] - Minim[i][j] == ans)
ansCount++;
}
int main() {
read();
while (p--) {
ans = 100000000; ansCount = 0;
int dx, dy;
f >> dx >> dy;
solve (dx, dy);
if (dx != dy)
solve (dy, dx);
g << ans << " " << ansCount << '\n';
}
return 0;
}