Pagini recente » Cod sursa (job #2780545) | Cod sursa (job #685898) | Cod sursa (job #2403428) | Cod sursa (job #1568261) | Cod sursa (job #2676944)
#include <bits/stdc++.h>
using namespace std;
const string FILENAME = "struti";
ifstream fin(FILENAME + ".in");
ofstream fout(FILENAME + ".out");
const int NMax = 1050;
struct var {
int val, x, y;
};
struct mydeque {
int i, j;
var v[NMax];
mydeque() : i(0), j(0) {}
void push_back(const var &other) {
v[j] = other;
++j;
}
void pop_back() {
--j;
}
void pop_front() {
++i;
}
bool empty() {
return (i == j);
}
var front() {
return v[i];
}
var back() {
return v[j - 1];
}
void clear() {
i = j = 0;
}
};
int n, m;
int v[NMax][NMax];
mydeque mDQ[NMax], MDQ[NMax], mnD, mxD;
pair < int, int > Solve(int a, int b) {
for (int i = 0; i < m; ++i) {
mDQ[i].clear();
MDQ[i].clear();
}
pair < int, int > ret = {INT_MAX, 0};
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
while (!mDQ[j].empty() && mDQ[j].front().x <= i - a) {
mDQ[j].pop_front();
}
while (!mDQ[j].empty() && v[i][j] <= mDQ[j].back().val) {
mDQ[j].pop_back();
}
mDQ[j].push_back({v[i][j], i, j});
while (!MDQ[j].empty() && MDQ[j].front().x <= i - a) {
MDQ[j].pop_front();
}
while (!MDQ[j].empty() && v[i][j] >= MDQ[j].back().val) {
MDQ[j].pop_back();
}
MDQ[j].push_back({v[i][j], i, j});
}
if (i >= a - 1) {
mnD.clear();
mxD.clear();
for (int j = 0; j < m; ++j) {
int mn = mDQ[j].front().val;
int mx = MDQ[j].front().val;
while (!mnD.empty() && mnD.front().y <= j - b) {
mnD.pop_front();
}
while (!mnD.empty() && mn <= mnD.back().val) {
mnD.pop_back();
}
mnD.push_back(mDQ[j].front());
while (!mxD.empty() && mxD.front().y <= j - b) {
mxD.pop_front();
}
while (!mxD.empty() && mx >= mxD.back().val) {
mxD.pop_back();
}
mxD.push_back(MDQ[j].front());
if (j >= b - 1) {
int dif = mxD.front().val - mnD.front().val;
if (ret.first > dif) {
ret = {dif, 1};
} else if (ret.first == dif) {
++ret.second;
}
}
}
}
}
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;
}