Pagini recente » Cod sursa (job #418932) | Cod sursa (job #1576621) | Cod sursa (job #1628364) | Cod sursa (job #129925) | Cod sursa (job #358068)
Cod sursa(job #358068)
#include <cstdio>
#include <deque>
using namespace std;
#define FIN "struti.in"
#define FOUT "struti.out"
#define N 1002
#define MAX 5000
#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, k, b;
char s[MAX];
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d%d%d\n", &m, &n, &p);
for (i = 1; i <= m; ++ i)
{
gets(s);
for (j = 0, k = 0, b = 0; (s[j] - '0' < 10 && s[j] - '0' >= 0) || s[j] == ' '; ++ j)
if (s[j] == ' ')
{
++ k;
v[i][k] = b;
b = 0;
}
else
b = b * 10 + (s[j] - '0');
++ k;
v[i][k] = b;
b = 0;
scanf("\n");
}
for (i = 1; i <= p; ++ i)
{
scanf("%d%d", &x, &y);
h = INF; c = 0;
solve(x, y);
if (x != y)
solve(y, x);
printf("%d% d\n", h, c);
}
}