Pagini recente » Cod sursa (job #3320394) | Cod sursa (job #3137216) | Cod sursa (job #3209996) | Cod sursa (job #194441) | Cod sursa (job #3354881)
#include <bits/stdc++.h>
#define ll long long
#define ld long double
using namespace std;
ifstream fin ("struti.in");
ofstream fout ("struti.out");
int n, m, p;
int v[1002][1002];
int dmin[1002][1002];
int dmax[1002][1002];
pair<int, int> sliding_window (int x, int y) {
for (int i = 1; i <= n; i++) {
deque <int> dqmin, dqmax;
for (int j = 1; j <= m; j++) {
while (!dqmin.empty() && v[i][dqmin.back()] >= v[i][j]) {
dqmin.pop_back();
}
dqmin.push_back(j);
while (!dqmax.empty() && v[i][dqmax.back()] <= v[i][j]) {
dqmax.pop_back();
}
dqmax.push_back(j);
if (j >= y) {
if (dqmin.front() < j - y + 1) {
dqmin.pop_front();
}
if (dqmax.front() < j - y + 1) {
dqmax.pop_front();
}
dmin[i][j - y + 1] = v[i][dqmin.front()];
dmax[i][j - y + 1] = v[i][dqmax.front()];
}
}
}
for (int j = 1; j <= m - y + 1; j++) {
deque <int> dqmin, dqmax;
for (int i = 1; i <= n; i++) {
while (!dqmin.empty() && dmin[dqmin.back()][j] >= dmin[i][j]) {
dqmin.pop_back();
}
dqmin.push_back(i);
while (!dqmax.empty() && dmax[dqmax.back()][j] <= dmax[i][j]) {
dqmax.pop_back();
}
dqmax.push_back(i);
if (i >= x) {
if (dqmin.front() < i - x + 1) {
dqmin.pop_front();
}
if (dqmax.front() < i - x + 1) {
dqmax.pop_front();
}
dmin[i - x + 1][j] = dmin[dqmin.front()][j];
dmax[i - x + 1][j] = dmax[dqmax.front()][j];
}
}
}
int mn = 100000, cnt;
for (int i = 1; i <= n - x + 1; i++) {
for (int j = 1; j <= m - y + 1; j++) {
if (dmax[i][j] - dmin[i][j] < mn) {
mn = dmax[i][j] - dmin[i][j];
cnt = 1;
}
else if (dmax[i][j] - dmin[i][j] == mn) {
++cnt;
}
}
}
return make_pair(mn, cnt);
}
int main()
{
fin >> n >> m >> p;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
fin >> v[i][j];
}
}
for (int i = 1; i <= p; i++) {
int x, y;
fin >> x >> y;
auto a = sliding_window(x, y);
if (x != y) {
auto b = sliding_window(y, x);
if (a.first < b.first) {
fout << a.first << " " << a.second << "\n";
}
else if (a.first > b.first) {
fout << b.first << " " << b.second << "\n";
}
else {
fout << a.first << " " << a.second + b.second << "\n";
}
}
else {
fout << a.first << " " << a.second << "\n";
}
}
return 0;
}