Pagini recente » Cod sursa (job #412359) | Cod sursa (job #159221) | Cod sursa (job #1917201) | Cod sursa (job #3340158) | Cod sursa (job #3333085)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("struti.in");
ofstream fout ("struti.out");
const int N_MAX = 1005;
int m, n, p;
int a[N_MAX][N_MAX];
pair <int, int> b[N_MAX][N_MAX], c[N_MAX][N_MAX];
deque <int> dq1, dq2;
int solve(int dx, int dy, int &cnt) {
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
b[i][j] = c[i][j] = {0, 0};
/// pe coloane
for (int j = 1; j <= m; j++) {
dq1.clear();
dq2.clear();
for (int i = 1; i <= n; i++) {
/// minim
while (!dq1.empty() && a[dq1.back()][j] >= a[i][j])
dq1.pop_back();
dq1.push_back(i);
/// maxim
while (!dq2.empty() && a[dq2.back()][j] <= a[i][j])
dq2.pop_back();
dq2.push_back(i);
if (dq1.front() <= i - dx)
dq1.pop_front();
if (dq2.front() <= i - dx)
dq2.pop_front();
if (i >= dx) {
b[i][j].first = a[dq1.front()][j];
b[i][j].second = a[dq2.front()][j];
}
}
}
/// pe linii
int alt_min = INT_MAX;
cnt = 0;
for (int i = dx; i <= n; i++) {
dq1.clear();
dq2.clear();
for (int j = 1; j <= m; j++) {
/// minim
while (!dq1.empty() && b[i][dq1.back()].first >= b[i][j].first)
dq1.pop_back();
dq1.push_back(j);
/// maxim
while (!dq2.empty() && b[i][dq2.back()].second <= b[i][j].second)
dq2.pop_back();
dq2.push_back(j);
if (dq1.front() <= j - dy)
dq1.pop_front();
if (dq2.front() <= j - dy)
dq2.pop_front();
if (j >= dy) {
int mini = b[i][dq1.front()].first, maxi = b[i][dq2.front()].second;
int dif = maxi - mini;
if (dif < alt_min) {
alt_min = dif;
cnt = 1;
}
else if (dif == alt_min)
cnt++;
}
}
}
return alt_min;
}
int main() {
fin >> m >> n >> p;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++)
fin >> a[i][j];
}
while (p--) {
int dx, dy;
fin >> dx >> dy;
if (dx == dy) {
int cnt = 0, mini = solve(dx, dy, cnt);
fout << mini << " " << cnt << "\n";
continue;
}
int cnt1 = 0, cnt2 = 0;
int min1 = solve(dx, dy, cnt1), min2 = solve(dy, dx, cnt2);
if (min1 < min2)
fout << min1 << " " << cnt1 << "\n";
else if (min1 == min2)
fout << min1 << " " << cnt1 + cnt2 << "\n";
else
fout << min2 << " " << cnt2 << "\n";
}
return 0;
}