Pagini recente » Cod sursa (job #1054340) | Cod sursa (job #3135979) | Cod sursa (job #276568) | Istoria paginii info-oltenia-2018/echipe/clasament/11-12 | Cod sursa (job #2202506)
#include <fstream>
#include <deque>
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
#define NMAX 1005
int nr, n, m, p, mini, minM[NMAX][NMAX], maxM[NMAX][NMAX], a[NMAX][NMAX];
deque<pair<int, int> > q1, q2;
void solve(int dx, int dy) {
int i, j;
for (i = 1; i <= n; ++i) {
q1.clear();
q2.clear();
for (j = 1; j <= m; ++j) {
while (!q1.empty() && q1.back().first >= a[i][j])
q1.pop_back();
q1.push_back(make_pair(a[i][j], j));
if (j - q1.front().second == dy)
q1.pop_front();
minM[i][j] = q1.front().first;
while (!q2.empty() && q2.back().first <= a[i][j])
q2.pop_back();
q2.push_back(make_pair(a[i][j], j));
if (j - q2.front().second == dy)
q2.pop_front();
maxM[i][j] = q2.front().first;
}
}
for (j = dy; j <= m; ++j) {
q1.clear();
q2.clear();
for (i = 1; i <= n; ++i) {
while (!q1.empty() && q1.back().first >= minM[i][j])
q1.pop_back();
q1.push_back(make_pair(minM[i][j], i));
if (i - q1.front().second == dx)
q1.pop_front();
while (!q2.empty() && q2.back().first <= maxM[i][j])
q2.pop_back();
q2.push_back(make_pair(maxM[i][j], i));
if (i - q2.front().second == dx)
q2.pop_front();
int dif = q2.front().first - q1.front().first;
if (i >= dx) {
if (mini > dif) {
mini = dif;
nr = 1;
} else if (mini == dif) {
++nr;
}
}
}
}
}
int main() {
int i, j, x, y;
f >> n >> m >> p;
for (i = 1; i <= n; ++i)
for (j = 1; j <= m; ++j)
f >> a[i][j];
for (i = 1; i <= p; ++i) {
f >> x >> y;
mini = 100000;
nr = 0;
solve(x, y);
if (x != y)
solve(y, x);
g << mini << ' ' << nr << '\n';
}
return 0;
}