Pagini recente » Cod sursa (job #1416124) | Cod sursa (job #1331713) | Cod sursa (job #842542) | Cod sursa (job #2096248) | Cod sursa (job #2067133)
#define tatal <iostream>
#define fiul <fstream>
#define sfantulduh <deque>
#define amin <utility>
#include tatal
#include fiul
#include sfantulduh
#include amin
using namespace std;
short a[1000][1000];
short colmin[1000][1000], colmax[1000][1000];
short m, n, p;
deque<short> dmin, dmax;
void gencol(short k) {
k--;
for (short j = 0; j < n; j++) {
for (short i = k; i < m; i++) {
for (short ii = i - k; ii <= i; ii++) {
if (ii == i - k) {
colmin[i][j] = a[ii][j];
colmax[i][j] = a[ii][j];
}
colmin[i][j] = min(colmin[i][j], a[ii][j]);
colmax[i][j] = max(colmax[i][j], a[ii][j]);
}
}
}
}
pair<short, int> gendeque(short dx, short dy) {
short mindelta = 8001, delta;
int count = 0;
for (int lin = dy - 1; lin < m; lin++) {
dmin.clear();
dmax.clear();
for (int col = 0; col < n; col++) {
if (!dmin.empty() && dmin.front() == col - dx)
dmin.pop_front();
if (!dmax.empty() && dmax.front() == col - dx)
dmax.pop_front();
while (!dmin.empty() && colmin[lin][col] < colmin[lin][dmin.back()])
dmin.pop_back();
dmin.push_back(col);
while (!dmax.empty() && colmax[lin][col] > colmax[lin][dmax.back()])
dmax.pop_back();
dmax.push_back(col);
delta = colmax[lin][dmax.front()] - colmin[lin][dmin.front()];
if (col >= dx - 1 && delta < mindelta) {
mindelta = delta;
count = 1;
} else if (delta == mindelta) {
count++;
}
}
}
return pair<short, int>(mindelta, count);
}
pair<short, int> solutiafinala(short dx, short dy) {
pair<short, int> p1, p2;
gencol(dy);
p1 = gendeque(dx, dy);
if (dx == dy) {
return p1;
} else {
gencol(dx);
p2 = gendeque(dy, dx);
if (p1 < p2) {
return p1;
} else if (p1 == p2) {
return pair<short, int>(p1.first, p1.second + p2.second);
} else {
return p2;
}
}
}
int main()
{
ifstream fin("struti.in");
ofstream fout("struti.out");
short dx, dy;
pair<short, int> pr;
fin >> m >> n >> p;
for (short i = 0; i < m; i++) {
for (short j = 0; j < n; j++)
fin >> a[i][j];
}
for (; p > 0; p--) {
fin >> dx >> dy;
pr = solutiafinala(dx, dy);
fout << pr.first << ' ' << pr.second << '\n';
}
return 0;
}