Pagini recente » Borderou de evaluare (job #2383670) | Cod sursa (job #2990398) | Cod sursa (job #1989783) | Cod sursa (job #691597) | Cod sursa (job #3158587)
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
const int NMAX = 1003;
int a[NMAX][NMAX], n, m;
int maxi[NMAX][NMAX], mini[NMAX][NMAX];
deque<pair<int, int> > dqmax, dqmin;
int nmin = 1e9, nr = 0;
void solve(int dx, int dy) {
for (int i = 1; i <= n; i++) {
while (!dqmax.empty())
dqmax.pop_back();
while (!dqmin.empty())
dqmin.pop_back();
for (int j = 1; j <= m; j++) {
while (!dqmin.empty() && dqmin.front().second < j - dy + 1) {
dqmin.pop_front();
}
while (!dqmax.empty() && dqmax.front().second < j - dy + 1) {
dqmax.pop_front();
}
while (!dqmin.empty() && dqmin.back().first > a[i][j]) {
dqmin.pop_back();
}
while (!dqmax.empty() && dqmax.back().first < a[i][j]) {
dqmax.pop_back();
}
dqmax.push_back(make_pair(a[i][j], j));
dqmin.push_back(make_pair(a[i][j], j));
maxi[i][j] = dqmax.front().first;
mini[i][j] = dqmin.front().first;
}
}
for (int j = 1; j <= m; j++) {
while (!dqmax.empty())
dqmax.pop_back();
while (!dqmin.empty())
dqmin.pop_back();
for (int i = 1; i <= n; i++) {
while (!dqmin.empty() && dqmin.front().second < i - dx + 1) {
dqmin.pop_front();
}
while (!dqmax.empty() && dqmax.front().second < i - dx + 1) {
dqmax.pop_front();
}
while (!dqmin.empty() && dqmin.back().first > mini[i][j]) {
dqmin.pop_back();
}
while (!dqmax.empty() && dqmax.back().first < maxi[i][j]) {
dqmax.pop_back();
}
dqmax.push_back(make_pair(maxi[i][j], i));
dqmin.push_back(make_pair(mini[i][j], i));
if (i >= dx && j >= dy) {
int dif = dqmax.front().first - dqmin.front().first;
if (dif < nmin) {
nmin = dif;
nr = 1;
} else if (dif == nmin) {
nr++;
}
}
}
}
}
int main() {
int q;
fin >> n >> m >> q;
for (int i = 1; i <= n; i++) {
for (int j =1; j <= m; j++)
fin >> a[i][j];
}
while (q--) {
int dx, dy;
fin >> dx >> dy;
nmin = 1e9;
nr = 0;
if (dx == dy) {
solve(dx, dy);
} else {
solve(dx, dy);
solve(dy, dx);
}
fout << nmin << ' ' << nr << '\n';
}
return 0;
}