Pagini recente » Cod sursa (job #985910) | Cod sursa (job #3194357) | Cod sursa (job #1753020) | Cod sursa (job #2205276)
#include <fstream>
#include <deque>
using namespace std;
ifstream in("struti.in");
ofstream out("struti.out");
const int MAXNM = 1e3;
int n, m, p, d1, d2;
int mat[MAXNM + 2][MAXNM + 2];
int abs(int nr) {
if (nr < 0)
return -nr;
return nr;
}
pair <int, int> retMinMax(int dx, int dy) {
struct ceva{
int val;
int poz;
ceva (int _val = 0, int _poz = 0) {
val = _val;
poz = _poz;
}
}dq;
int minim, maxim;
minim = 8001, maxim = 0;
int minDif = abs(maxim - minim);
int cnt = 0;
int minMat[n + 2][m + 2], maxMat[n + 2][m + 2];
for (int i = 1; i <= n; ++ i) {
deque <ceva>minDq;
deque <ceva>maxDq;
for (int j = 1; j <= m; ++ j) {
dq.poz = j;
dq.val = mat[i][j];
if (!minDq.empty()) {
while (minDq.back().val >= dq.val) {
minDq.pop_back();
if (minDq.empty())
break;
}
}
minDq.push_back(dq);
while (minDq.front().poz <= dq.poz - dx)
minDq.pop_front();
minMat[i][j] = minDq.front().val;
if (!maxDq.empty()) {
while (maxDq.back().val <= dq.val) {
maxDq.pop_back();
if (maxDq.empty())
break;
}
}
maxDq.push_back(dq);
while (maxDq.front().poz <= dq.poz - dx)
maxDq.pop_front();
maxMat[i][j] = maxDq.front().val;
}
}
for (int i = dx; i <= m; ++ i) {
deque <ceva>minDq;
deque <ceva>maxDq;
for (int j = 1; j < dy; ++ j) {
ceva max_elem, min_elem;
min_elem.poz = max_elem.poz = j;
min_elem.val = minMat[j][i], max_elem.val = maxMat[j][i];
if (!minDq.empty()) {
while (minDq.back().val >= min_elem.val) {
minDq.pop_back();
if (minDq.empty())
break;
}
}
minDq.push_back(min_elem);
if (!maxDq.empty()) {
while (maxDq.back().val <= max_elem.val) {
maxDq.pop_back();
if (maxDq.empty())
break;
}
}
maxDq.push_back(max_elem);
}
for (int j = dy; j <= n; ++ j){
ceva max_elem, min_elem;
min_elem.poz = max_elem.poz = j;
min_elem.val = minMat[j][i], max_elem.val = maxMat[j][i];
if (!minDq.empty()) {
while (minDq.back().val >= min_elem.val) {
minDq.pop_back();
if (minDq.empty())
break;
}
}
minDq.push_back(min_elem);
while (minDq.front().poz <= min_elem.poz - dy)
minDq.pop_front();
if (!maxDq.empty()) {
while (maxDq.back().val <= max_elem.val) {
maxDq.pop_back();
if (maxDq.empty())
break;
}
}
maxDq.push_back(max_elem);
while (maxDq.front().poz <= max_elem.poz - dy)
maxDq.pop_front();
minim = minDq.front().val;
maxim = maxDq.front().val;
if (abs(maxim - minim) < minDif) {
cnt = 1;
minDif = abs(maxim - minim);
}
else if (abs(maxim - minim) == minDif)
++ cnt;
}
}
return make_pair(minDif, cnt);
}
int main() {
in >> n >> m >> p;
for (int i = 1; i <= n; ++ i)
for (int j = 1; j <= m; ++ j)
in >> mat[i][j];
while (p --) {
in >> d1 >> d2;
pair <int, int>rez;
rez = retMinMax(d1, d2);
pair <int, int>aux;
aux = retMinMax(d2, d1);
if (rez.first < aux.first)
out << rez.first << ' ' << rez.second << '\n';
if (rez.first == aux.first)
if (d1 != d2)
out << rez.first << ' ' << rez.second + aux.second << '\n';
else
out << rez.first << ' ' << rez.second << '\n';
if (rez.first > aux.first)
out << aux.first << ' ' << aux.second << '\n';
}
return 0;
}