Pagini recente » Cod sursa (job #144588) | Cod sursa (job #1374301) | Cod sursa (job #2180519) | Cod sursa (job #748262) | Cod sursa (job #2724426)
#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;
bool marked[nmax];
struct elem {
int nr, x;
bool operator < (const elem &aux) const {
if (nr != aux.nr) return nr < aux.nr;
return x < aux.x;
}
bool operator > (const elem &aux) const {
if (nr != aux.nr) return nr > aux.nr;
return x < aux.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;
int ans = 0, MINI = INT_MAX;
memset(marked, 0, m + 5);
for (int i2 = 1; i2 + dx <= n; ++i2) {
memset(marked, 0, m + 5);
int ii = i2 + dx - 1;
priority_queue <elem, vector <elem> > q1;
priority_queue <elem, vector <elem>, greater <elem> > q2;
for (int j = 1; j <= m; ++j) {
int mini = INT_MAX, maxi = 0;
for (int i = i2; i <= ii; ++i) {
if (a[i][j] < mini) mini = a[i][j];
if (a[i][j] > maxi) maxi = a[i][j];
}
if (j > dy) {
marked[j - dy] = true;
}
q2.push({mini, j});
q1.push({maxi, j});
int pos = q1.top().x;
while (!q1.empty() && marked[pos]) {
q1.pop();
pos = q1.top().x;
}
pos = q2.top().x;
while (!q2.empty() && marked[pos]) {
q2.pop();
pos = q2.top().x;
}
int nr1 = q2.top().nr, nr2 = q1.top().nr;
if (j >= dy) {
if (nr2 - nr1 < MINI) {
MINI = nr2 - nr1;
ans = 1;
}
else if (nr2 - nr1 == MINI) ++ans;
}
}
}
if (dx != dy) {
swap(dx, dy);
for (int i2 = 1; i2 + dx <= n; ++i2) {
int ii = i2 + dx - 1;
memset(marked, 0, m + 5);
priority_queue <elem, vector <elem> > q1;
priority_queue <elem, vector <elem>, greater <elem> > q2;
for (int j = 1; j <= m; ++j) {
int mini = INT_MAX, maxi = 0;
for (int i = i2; i <= ii; ++i) {
if (a[i][j] < mini) mini = a[i][j];
if (a[i][j] > maxi) maxi = a[i][j];
}
if (j > dy) {
marked[j - dy] = true;
}
q2.push({mini, j});
q1.push({maxi, j});
int pos = q1.top().x;
while (!q1.empty() && marked[pos]) {
q1.pop();
pos = q1.top().x;
}
pos = q2.top().x;
while (!q2.empty() && marked[pos]) {
q2.pop();
pos = q2.top().x;
}
int nr1 = q2.top().nr, nr2 = q1.top().nr;
if (j >= dy) {
if (nr2 - nr1 < MINI) {
MINI = nr2 - nr1;
ans = 1;
}
else if (nr2 - nr1 == MINI) ++ans;
}
}
}
}
fout << MINI << ' ' << ans + 1<< '\n';
}
return 0;
}