Pagini recente » Cod sursa (job #1949482) | Cod sursa (job #1760158) | Cod sursa (job #2854758) | Cod sursa (job #1419783) | Cod sursa (job #357783)
Cod sursa(job #357783)
#include <cstdio>
#include <deque>
using namespace std;
#define FIN "struti.in"
#define FOUT "struti.out"
#define N 1002
#define INF 10000000
int n, m, p, v[N][N], a[N][N], b[N][N], h, c;
deque <int> dmax, dmin;
void solve(int x, 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()
{
int i, j, x, y;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d%d%d", &m, &n, &p);
for (i = 1; i <= m; ++ i)
for (j = 1; j <= n; ++ j)
scanf("%d", &v[i][j]);
for (i = 1; i <= p; ++ i)
{
scanf("%d%d", &x, &y);
h = INF; c = 0;
solve(x, y);
solve(y, x);
if (x == y)
c /= 2;
printf("%d% d\n", h, c);
}
}