Pagini recente » Cod sursa (job #3147472) | Cod sursa (job #1519583) | Cod sursa (job #2945502) | Cod sursa (job #2499418) | Cod sursa (job #2756067)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
const int nmax = 1005;
int n, m, a[nmax][nmax], p, mini[nmax][nmax], maxi[nmax][nmax], ans, nr;
void rezolvare (int dx, int dy) {
deque <int> minn, maxx;
for (int j = 1; j <= m; ++j) {
minn.clear();
maxx.clear();
for (int i = 1; i <= n; ++i) {
while (!minn.empty() && i - minn.front() >= dx) minn.pop_front();
while (!minn.empty() && a[i][j] <= a[minn.back()][j]) minn.pop_back();
minn.push_back(i);
while (!maxx.empty() && i - maxx.front() >= dx) maxx.pop_front();
while (!maxx.empty() && a[i][j] >= a[maxx.back()][j]) maxx.pop_back();
maxx.push_back(i);
mini[i][j] = a[minn.front()][j];
maxi[i][j] = a[maxx.front()][j];
}
}
for (int i = dx; i <= n; ++i) {
minn.clear();
maxx.clear();
for (int j = 1; j <= m; ++j) {
while (!minn.empty() && j - minn.front() >= dy) minn.pop_front();
while (!maxx.empty() && j - maxx.front() >= dy) maxx.pop_front();
while (!minn.empty() && mini[i][j] <= mini[i][minn.back()]) minn.pop_back();
while (!maxx.empty() && maxi[i][j] >= maxi[i][maxx.back()]) maxx.pop_back();
minn.push_back(j);
maxx.push_back(j);
if (j >= dy) {
if (maxi[i][maxx.front()] - mini[i][minn.front()] < ans) {
ans = maxi[i][maxx.front()] - mini[i][minn.front()];
nr = 1;
}
else if (maxi[i][maxx.front()] - mini[i][minn.front()] == ans) ++nr;
}
}
}
}
int main()
{
fin >> n >> m >> p;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
fin >> a[i][j];
for (int k = 1; k <= p; ++k) {
int dx, dy;
fin >> dx >> dy;
ans = INT_MAX, nr = 0;
rezolvare(dx, dy);
if (dx != dy) rezolvare(dy, dx);
fout << ans << ' ' << nr << '\n';
}
return 0;
}