Pagini recente » Cod sursa (job #2685532) | Cod sursa (job #2636612) | Cod sursa (job #1776737) | Cod sursa (job #893579) | Cod sursa (job #2208949)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin("struti.in");
ofstream cout("struti.out");
const short int N = 1007;
short int v[N][N], mini[N][N], maxi[N][N], lini[N][N], dq[N], n, m;
pair < short int, int > f(short int x, short int y) {
short 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()
{
short int p, x, y;
pair < short int, short 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;
}