Pagini recente » Cod sursa (job #1739661) | Cod sursa (job #1580775) | Cod sursa (job #516758) | Cod sursa (job #1327592) | Cod sursa (job #600050)
Cod sursa(job #600050)
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
fstream fin ("struti.in", ios::in);
fstream fout ("struti.out", ios::out);
#define INF 0x3f3f3f3f
#define MAXN 1010
int n, m, q, x, y;
int mat[MAXN][MAXN], matV[2][MAXN][MAXN], matH[2][MAXN][MAXN];
int mn, nmin;
void horz (int k)
{
for (int i = 0; i < n; ++i) {
deque <int> dmin, dmax;
for (int j = 0; j < m; ++j) {
while (!dmin.empty () && mat[i][dmin.back ()] >= mat[i][j]) {
dmin.pop_back ();
}
while (!dmax.empty () && mat[i][dmax.back ()] <= mat[i][j]) {
dmax.pop_back ();
}
dmin.push_back (j);
dmax.push_back (j);
if (dmin.front () == j - k)
dmin.pop_front ();
if (dmax.front () == j - k)
dmax.pop_front ();
if (j >= k - 1) {
matH[0][i][j] = mat[i][dmax.front ()];
matH[1][i][j] = mat[i][dmin.front ()];
}
}
}
}
void vert (int k)
{
for (int i = 0; i < m; ++i) {
deque <int> dmin, dmax;
for (int j = 0; j < n; ++j) {
while (!dmin.empty () && matH[0][dmin.back ()][i] <= matH[0][j][i]) {
dmin.pop_back ();
}
while (!dmax.empty () && matH[1][dmax.back ()][i] >= matH[1][j][i]) {
dmax.pop_back ();
}
dmin.push_back (j);
dmax.push_back (j);
if (dmin.front () == j - k)
dmin.pop_front ();
if (dmax.front () == j - k)
dmax.pop_front ();
if (j >= k - 1) {
matV[0][j][i] = matH[0][dmin.front ()][i];
matV[1][j][i] = matH[1][dmax.front ()][i];
}
}
}
}
bool minC (int a, int b) {return a > b;};
bool maxC (int a, int b) {return a < b;};
int abs (int a) {return a > 0 ? a : -a;};
void combine (int sx, int sy)
{
for (int i = sy - 1; i < n; ++i) {
for (int j = sx - 1; j < m; ++j) {
int cm = abs (matV[1][i][j] - matV[0][i][j]);
if (cm < mn) {
mn = cm, nmin = 1;
} else if (cm == mn) {
nmin ++;
}
}
}
}
void doTest ()
{
fin >> x >> y;
horz (x);
vert (y);
mn = INF, nmin = 0;
combine (x, y);
if (x != y) {
horz (y);
vert (x);
combine (y, x);
}
fout << mn << " " << nmin << '\n';
}
int main ()
{
fin >> n >> m >> q;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
fin >> mat[i][j];
}
}
for (int i = 0; i < q; ++i) {
doTest ();
}
fin.close ();
fout.close ();
return 0;
}