Pagini recente » Borderou de evaluare (job #2221368) | Borderou de evaluare (job #2432124) | Borderou de evaluare (job #474191) | Borderou de evaluare (job #2277689) | Cod sursa (job #1967767)
#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];
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] ];
}
}
int dmin = INF;
int cnt = 0;
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++;
}
int vmax2D = vmax[ D[front] ][j];
if (i >= dx - 1 && j >= dy - 1) {
int diff = vmax2D - 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 >> N >> M >> 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;
}