Pagini recente » Cod sursa (job #209955) | Borderou de evaluare (job #3331057) | Borderou de evaluare (job #1514159) | Borderou de evaluare (job #2621817) | Cod sursa (job #3317023)
#include<bits/stdc++.h>
using namespace std;
int n, m;
int a[1001][1001], v1[1001][1001], v2[1001][1001]; // v1 de min, v2 de max
int p;
pair<int, int> solve(int x, int y) {
deque<int> d1, d2, d3, d4;
//linii si secv de lungime y
//col si secv de x
for (int i = 1; i <= n; ++i) {
d1.clear();
d2.clear();
for (int j = 1; j <= m; ++j) {
while (!d1.empty() && a[i][d1.back()] >= a[i][j]) {
d1.pop_back();
}
d1.push_back(j);
if (d1.front() <= j - y) {
d1.pop_front();
}
while (!d2.empty() && a[i][d2.back()] <= a[i][j]) {
d2.pop_back();
}
d2.push_back(j);
if (d2.front() <= j - y) {
d2.pop_front();
}
if (j >= y) {
v1[i][j - y + 1] = a[i][d1.front()];
v2[i][j - y + 1] = a[i][d2.front()];
}
}
}
for (int j = 1; j <= m - y + 1; ++j) {
d3.clear();
d4.clear();
for (int i = 1; i <= n; ++i) {
while (!d3.empty() && v1[d3.back()][j] >= v1[i][j]) {
d3.pop_back();
}
d3.push_back(i);
if (d3.front() <= i - x) {
d3.pop_front();
}
while (!d4.empty() && v2[d4.back()][j] <= v2[i][j]) {
d4.pop_back();
}
d4.push_back(i);
if (d4.front() <= i - x) {
d4.pop_front();
}
if (i >= x) {
v1[i - x + 1][j] = v1[d3.front()][j];
v2[i - x + 1][j] = v2[d4.front()][j];
}
}
}
int mn = INT_MAX, cnt = 0;
for (int i = 1; i <= n - x + 1; ++i) {
for(int j = 1; j <= m - y + 1; ++j) {
if (mn == v2[i][j] - v1[i][j]) {
++cnt;
}
else if (mn > v2[i][j] - v1[i][j]) {
mn = v2[i][j] - v1[i][j];
cnt = 1;
}
}
}
return make_pair(mn, cnt);
}
int main() {
freopen("struti.in", "r", stdin);
freopen("struti.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> p;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cin >> a[i][j];
}
}
int x, y;
while (p--) {
cin >> x >> y;
/*cout << solve(x, y).first << ' ';*/
if (x != y) {
auto sol1 = solve(x, y);
auto sol2 = solve(y, x);
if (sol1.first < sol2.first) {
cout << sol1.first << ' ' << sol1.second << '\n';
}
else if (sol2.first < sol1.first) {
cout << sol2.first << ' ' << sol2.second << '\n';
}
else {
cout << sol1.first << ' ' << sol1.second + sol2.second << '\n';
}
}
else {
auto sol1 = solve(x, y);
cout << sol1.first << ' ' << sol1.second << '\n';
}
}
return 0;
}