Pagini recente » Istoria paginii runda/minune8/clasament | Cod sursa (job #859211) | Cod sursa (job #531918) | Cod sursa (job #1912129) | Cod sursa (job #2208951)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin("struti.in");
ofstream cout("struti.out");
const int N = 1007;
int v[N][N], mini[N][N], maxi[N][N], lini[N][N], dq[N], n, m;
pair < int, int > f(int x, int y) {
int st, dr, diferenta(8e3);
int ap(0);
for (int i = 1; i <= n; ++i) {
st = 0; dr = -1;
for (int j = 1; j <= m; ++j) {
while (st <= dr && dq[st] <= j - x) {
++st;
}
while (st <= dr && v[i][dq[dr]] >= v[i][j]) {
--dr;
}
dq[++dr] = j;
if (j >= x) {
lini[i][j - x + 1] = v[i][dq[st]];
}
}
}
for (int j = 1; j <= m - x + 1; ++j) {
st = 0;
dr = -1;
for (int i = 1; i <= n; ++i) {
while (st <= dr && dq[st] <= i - y) {
++st;
}
while (st <= dr && lini[dq[dr]][j] >= lini[i][j]) {
--dr;
}
dq[++dr] = i;
if (i >= y) {
mini[i - y + 1][j] = lini[dq[st]][j];
}
}
}
for (int i = 1; i <= n; ++i) {
st = 0; dr = -1;
for (int j = 1; j <= m; ++j) {
while (st <= dr && dq[st] == j - x) {
++st;
}
while (st <= dr && v[i][dq[dr]] <= v[i][j]) {
--dr;
}
dq[++dr] = j;
if (j >= x) {
lini[i][j - x + 1] = v[i][dq[st]];
}
}
}
for (int j = 1; j <= m - x + 1; ++j) {
st = 0;
dr = -1;
for (int i = 1; i <= n; ++i) {
while (st <= dr && dq[st] == i - y) {
++st;
}
while (st <= dr && lini[dq[dr]][j] <= lini[i][j]) {
--dr;
}
dq[++dr] = i;
if (i >= y) {
if (lini[dq[st]][j] - mini[i - y + 1][j] < diferenta) {
diferenta = lini[dq[st]][j] - mini[i - y + 1][j];
ap = 0;
}
if (diferenta == lini[dq[st]][j] - mini[i - y + 1][j]) {
++ap;
}
mini[i - y + 1][j] = lini[dq[st]][j];
}
}
}
return make_pair(diferenta, ap);
}
int main()
{
int p, x, y;
pair < int, int > var1, var2;
cin >> n >> m >> p;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cin >> v[i][j];
}
}
for (int i = 0; i < p; ++i) {
cin >> x >> y;
if (x == y) {
var1 = f(x, y);
cout << var1.first << " " << var1.second << "\n";
continue;
}
var1 = f(x, y);
var2 = f(y, x);
if (var1.first == var2.first) {
cout << var1.first << " " << var1.second + var2.second << "\n";
}
else {
if (var1.first < var2.first) {
cout << var1.first << " " << var1.second << "\n";
}
else {
cout << var2.first << " " << var2.second << "\n";
}
}
}
return 0;
}