Pagini recente » Borderou de evaluare (job #728285) | Borderou de evaluare (job #2044722) | Borderou de evaluare (job #2830248) | Borderou de evaluare (job #1210983) | Cod sursa (job #1967758)
#include <bits/stdc++.h>
using namespace std;
#define INF 1000000000
#define MAXN 1050
int N, M, P;
int A[MAXN][MAXN];
int D[MAXN], front, back;
int vmin[MAXN][MAXN], vmax[MAXN][MAXN];
int vmin2D[MAXN][MAXN], vmax2D[MAXN][MAXN];
pair<int, int> solve(int dx, int dy) {
for (int i = 0; i < N; i++) {
front = 1;
back = 0;
for (int j = 0; j < M; j++) {
while (front <= back && A[i][j] <= A[i][ D[back] ]) {
back--;
}
D[++back] = j;
if (D[front] == j - dy) {
front++;
}
vmin[i][j] = A[i][ D[front] ];
}
}
for (int j = 0; j < M; j++) {
front = 1;
back = 0;
for (int i = 0; i < N; i++) {
while (front <= back && vmin[i][j] <= vmin[ D[back] ][j]) {
back--;
}
D[++back] = i;
if (D[front] == i - dx) {
front++;
}
vmin2D[i][j] = vmin[ D[front] ][j];
}
}
for (int i = 0; i < N; i++) {
front = 1;
back = 0;
for (int j = 0; j < M; j++) {
while (front <= back && A[i][j] >= A[i][ D[back] ]) {
back--;
}
D[++back] = j;
if (D[front] == j - dy) {
front++;
}
vmax[i][j] = A[i][ D[front] ];
}
}
for (int j = 0; j < M; j++) {
front = 1;
back = 0;
for (int i = 0; i < N; i++) {
while (front <= back && vmax[i][j] >= vmax[ D[back] ][j]) {
back--;
}
D[++back] = i;
if (D[front] == i - dx) {
front++;
}
vmax2D[i][j] = vmax[ D[front] ][j];
}
}
int dmin = INF;
int cnt = 0;
for (int i = dx - 1; i < N; i++) {
for (int j = dy - 1; j < M; j++) {
int diff = vmax2D[i][j] - vmin2D[i][j];
if (diff < dmin) {
dmin = diff;
cnt = 1;
} else if (diff == dmin) {
cnt++;
}
}
}
return { dmin, cnt };
}
int main() {
assert(freopen("struti.in", "r", stdin));
assert(freopen("struti.out", "w", stdout));
cin.sync_with_stdio(false);
cin >> M >> N >> P;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> A[i][j];
}
}
int dx, dy;
while (P-- > 0) {
cin >> dx >> dy;
auto res = solve(dx, dy);
if (dx != dy) {
auto res2 = solve(dy, dx);
if (res2.first < res.first) {
res = res2;
} else if (res2.first == res.first) {
res.second += res2.second;
}
}
cout << res.first << ' ' << res.second << '\n';
}
return 0;
}