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