Pagini recente » Cod sursa (job #1447953) | Cod sursa (job #983382) | Cod sursa (job #2727818) | Cod sursa (job #3415) | Cod sursa (job #2596911)
#include <fstream>
#include <deque>
#include <algorithm>
#include <string.h>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
deque <int> minq;
deque <int> maxq;
const int NMAX = 1e3 + 2;
int a[NMAX][NMAX], cnt, n, m, min_crt, p;
int mini[NMAX][NMAX], maxi[NMAX][NMAX];
void solve(int x, int y)
{
memset(mini, 0, sizeof mini);
memset(maxi, 0, sizeof maxi);
for (int i = 1; i <= n; ++i)
{
minq.clear();
maxq.clear();
for (int j = 1; j <= m; ++j)
{
while (!minq.empty() && minq.front() < j - x + 1)
minq.pop_front();
while (!minq.empty() && a[i][minq.front()] >= a[i][j])
minq.pop_back();
minq.push_back(j);
mini[i][j] = a[i][minq.front()];
while (!maxq.empty() && maxq.front() < j - x + 1)
maxq.pop_front();
while (!maxq.empty() && a[i][maxq.front()] <= a[i][j])
maxq.pop_back();
maxq.push_back(j);
maxi[i][j] = a[i][maxq.front()];
}
}
for (int j = 1; j <= m; ++j)
{
minq.clear();
maxq.clear();
for (int i = 1; i <= n; ++i)
{
while (!minq.empty() && minq.front() < i - y + 1)
minq.pop_front();
while (!minq.empty() && mini[minq.front()][j] > mini[i][j])
minq.pop_back();
minq.push_back(i);
while (!maxq.empty() && maxq.front() < i - y + 1)
maxq.pop_front();
while (!maxq.empty() && maxi[maxq.front()][j] < maxi[i][j])
maxq.pop_back();
maxq.push_back(i);
if (i >= y && j >= x)
{
int s = maxi[maxq.front()][j] - mini[minq.front()][j];
if (s < min_crt)
{
min_crt = s;
cnt = 1;
}
else if (s == min_crt) ++cnt;
}
}
}
}
int x, y;
int main()
{
fin >> n >> m >> p;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
fin >> a[i][j];
while (p--)
{
fin >> x >> y;
min_crt = 10000;
cnt = 0;
solve(x, y);
if (x != y) solve(y, x);
fout << min_crt << " " << cnt << "\n";
}
return 0;
}