Pagini recente » Cod sursa (job #915417) | Cod sursa (job #1686375) | Cod sursa (job #1629516) | Cod sursa (job #1166111) | Cod sursa (job #358316)
Cod sursa(job #358316)
#include <cstdio>
#include <deque>
using namespace std;
#define FIN "struti.in"
#define FOUT "struti.out"
#define N 1001
#define INF 32000
short int n, m, p, v[N][N], a[N][N], b[N][N];
int h, c;
deque <short int> dmax, dmin;
void solve(short int x, short int y)
{
int i, j;
for (i = 1; i <= m; ++ i)
{
dmin.clear();
dmax.clear();
for (j = 1; j <= n; ++ j)
{
while (!dmin.empty() && j - dmin.front() >= x)
dmin.pop_front();
while (!dmax.empty() && j - dmax.front() >= x)
dmax.pop_front();
while (!dmin.empty() && v[i][dmin.back()] > v[i][j])
dmin.pop_back();
while (!dmax.empty() && v[i][dmax.back()] < v[i][j])
dmax.pop_back();
dmin.push_back(j);
dmax.push_back(j);
a[i][j] = v[i][dmin.front()];
b[i][j] = v[i][dmax.front()];
}
}
for (j = 1; j <= n; ++ j)
{
dmin.clear();
dmax.clear();
for (i = 1; i <= m; ++ i)
{
while (!dmin.empty() && i - dmin.front() >= y)
dmin.pop_front();
while (!dmax.empty() && i - dmax.front() >= y)
dmax.pop_front();
while (!dmin.empty() && a[dmin.back()][j] > a[i][j])
dmin.pop_back();
while (!dmax.empty() && b[dmax.back()][j] < b[i][j])
dmax.pop_back();
dmin.push_back(i);
dmax.push_back(i);
if(b[dmax.front()][j] > a[dmin.front()][j] && j >= x && i >= y)
if (b[dmax.front()][j] - a[dmin.front()][j] < h)
{
h = b[dmax.front()][j] - a[dmin.front()][j];
c = 1;
}
else if (b[dmax.front()][j] - a[dmin.front()][j] == h)
++ c;
}
}
}
int main()
{
short int i, j, x, y;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%hd%hd%hd", &m, &n, &p);
for (i = 1; i <= m; ++ i)
for (j = 1; j <= n; ++ j)
scanf("%hd", &v[i][j]);
for (i = 1; i <= p; ++ i)
{
scanf("%hd%hd", &x, &y);
h = INF; c = 0;
solve(x, y);
if (x != y)
solve(y, x);
printf("%d %d\n", h, c);
}
}