Pagini recente » Istoria paginii utilizator/winterchallenge2020 | Cod sursa (job #3303089) | Cod sursa (job #3352775)
#include <fstream>
#include <deque>
#include <algorithm>
#include <iostream>
using namespace std;
int M, N, P, dx, dy, i, j;
int a[2005][2005], mx[2005][2005], mn[2005][2005];
long long rez_min, rez_cnt;
void calc(int R, int C) {
for (int i = 1; i <= M; ++i) {
deque<int> d1, d2;
for (int j = 1; j <= N; ++j) {
while (!d1.empty() && a[i][d1.back()] <= a[i][j])
d1.pop_back();
while (!d2.empty() && a[i][d2.back()] >= a[i][j])
d2.pop_back();
d1.push_back(j); d2.push_back(j);
if (d1.front() <= j - C)
d1.pop_front();
if (d2.front() <= j - C)
d2.pop_front();
if (j >= C) {
mx[i][j - C + 1] = a[i][d1.front()]; mn[i][j - C + 1] = a[i][d2.front()];
}
}
}
for (int j = 1; j <= N - C + 1; ++j) {
deque<int> d1, d2;
for (int i = 1; i <= M; ++i) {
while (!d1.empty() && mx[d1.back()][j] <= mx[i][j])
d1.pop_back();
while (!d2.empty() && mn[d2.back()][j] >= mn[i][j])
d2.pop_back();
d1.push_back(i); d2.push_back(i);
if (d1.front() <= i - R)
d1.pop_front();
if (d2.front() <= i - R)
d2.pop_front();
if (i >= R) {
int cur = mx[d1.front()][j] - mn[d2.front()][j];
if (cur < rez_min) { rez_min = cur; rez_cnt = 1; }
else if (cur == rez_min) rez_cnt++;
}
}
}
}
int main() {
ifstream fin("struti.in");
ofstream fout("struti.out");
cin>>M>>N>>P;
for (i = 1; i <= M; ++i)
for (j = 1; j <= N; ++j) cin >> a[i][j];
while (P--) {
cin >> dx >> dy;
rez_min = 999999999;
rez_cnt = 0;
calc(dx, dy);
if (dx != dy) calc(dy, dx);
cout << rez_min <<" " <<rez_cnt << "\n";
}
return 0;
}