Pagini recente » Cod sursa (job #1008408) | Cod sursa (job #1845557) | Cod sursa (job #2563262) | Monitorul de evaluare | Cod sursa (job #2676929)
#include <bits/stdc++.h>
using namespace std;
const string FILENAME = "struti";
ifstream fin(FILENAME + ".in");
ofstream fout(FILENAME + ".out");
const int NMax = 1050;
int n, m;
int v[NMax][NMax];
pair < int, int > Solve(int a, int b) {
multiset < int > MSet;
for (int i = 0; i < a; ++i) {
for (int j = 0; j < b; ++j) {
MSet.insert(v[i][j]);
}
}
pair < int, int > ret = {*MSet.rbegin() - *MSet.begin(), 1};
for (int i = a - 1; i < n; ++i) {
for (int j = b; j < m; ++j) {
for (int k = 0; k < a; ++k) {
MSet.erase(MSet.find(v[i - k][j - b]));
MSet.insert(v[i - k][j]);
}
int dif = *MSet.rbegin() - *MSet.begin();
if (ret.first > dif) {
ret = {dif, 1};
} else if (ret.first == dif) {
++ret.second;
}
}
++i;
if (i < n) {
for (int k = 0; k < b; ++k) {
MSet.erase(MSet.find(v[i - a][m - k - 1]));
MSet.insert(v[i][m - k - 1]);
}
int dif = *MSet.rbegin() - *MSet.begin();
if (ret.first > dif) {
ret = {dif, 1};
} else if (ret.first == dif) {
++ret.second;
}
for (int j = m - b - 1; j >= 0; --j) {
for (int k = 0; k < a; ++k) {
MSet.erase(MSet.find(v[i - k][j + b]));
MSet.insert(v[i - k][j]);
}
int dif = *MSet.rbegin() - *MSet.begin();
if (ret.first > dif) {
ret = {dif, 1};
} else if (ret.first == dif) {
++ret.second;
}
}
}
++i;
if (i < n) {
for (int k = 0; k < b; ++k) {
MSet.erase(MSet.find(v[i - a][k]));
MSet.insert(v[i][k]);
}
int dif = *MSet.rbegin() - *MSet.begin();
if (ret.first > dif) {
ret = {dif, 1};
} else if (ret.first == dif) {
++ret.second;
}
}
--i;
}
return ret;
}
int main() {
int q;
fin >> n >> m >> q;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
fin >> v[i][j];
}
}
while (q--) {
int a, b; fin >> a >> b;
pair < int, int > ord = Solve(a, b);
if (a != b) {
pair < int, int > tmp = Solve(b, a);
if (tmp.first < ord.first) {
ord = tmp;
} else if (tmp.first == ord.first) {
ord.second += tmp.second;
}
}
fout << ord.first << " " << ord.second << "\n";
}
return 0;
}