Pagini recente » Diferente pentru problema/sec intre reviziile 2 si 1 | Borderou de evaluare (job #661905) | Diferente pentru problema/substr intre reviziile 6 si 4 | Borderou de evaluare (job #2205109) | Cod sursa (job #3353232)
#include <bits/stdc++.h>
#define DIM 1001
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int n, m, Q, dx, dy, ret, cnt, i, j, x, y;
int a[DIM][DIM], amin[DIM][DIM], amax[DIM][DIM];
void Solve(int dx, int dy)
{
for (int i = 1; i <= n; i++) {
deque <int> dqmin, dqmax;
for (int j = 1; j <= m; j++) {
while (!dqmin.empty() && dy <= j - dqmin.front()) {
dqmin.pop_front();
}
while (!dqmin.empty() && a[i][dqmin.back()] >= a[i][j]) {
dqmin.pop_back();
}
dqmin.push_back(j);
if (j >= dy) {
amin[i][j - dy + 1] = a[i][dqmin.front()];
}
while (!dqmax.empty() && dy <= j - dqmax.front()) {
dqmax.pop_front();
}
while (!dqmax.empty() && a[i][dqmax.back()] <= a[i][j]) {
dqmax.pop_back();
}
dqmax.push_back(j);
if (j >= dy) {
amax[i][j - dy + 1] = a[i][dqmax.front()];
}
}
}
for (int j = 1; j <= m - dy + 1; j++) {
deque <int> dqmin, dqmax;
for (int i = 1; i <= n; i++) {
while (!dqmin.empty() && dx <= i - dqmin.front()) {
dqmin.pop_front();
}
while (!dqmin.empty() && amin[dqmin.back()][j] >= amin[i][j]) {
dqmin.pop_back();
}
dqmin.push_back(i);
while (!dqmax.empty() && dx <= i - dqmax.front()) {
dqmax.pop_front();
}
while (!dqmax.empty() && amax[dqmax.back()][j] <= amax[i][j]) {
dqmax.pop_back();
}
dqmax.push_back(i);
if (i >= dx) {
int Min = amin[dqmin.front()][j];
int Max = amax[dqmax.front()][j];
if (Max - Min < ret) {
ret = Max - Min;
cnt = 1;
} else if (Max - Min == ret) {
++cnt;
}
}
}
}
}
int main(void)
{
fin >> n >> m >> Q;
for (i = 1; i <= n; i++) {
for (j = 1; j <= m; j++) {
fin >> a[i][j];
}
}
while (Q--) {
fin >> x >> y;
ret = 1e9, cnt = 0;
Solve(x, y);
if (x != y) {
swap(x, y);
Solve(x, y);
}
fout << ret << " " << cnt << "\n";
}
}