Pagini recente » Cod sursa (job #2783166) | Cod sursa (job #1497943) | Cod sursa (job #1175666) | Cod sursa (job #507940) | Cod sursa (job #904064)
Cod sursa(job #904064)
#include <cstdio>
#include <cstring>
#include <vector>
#define NMAX 1024
#define PMAX 32
#define INF 1 << 20
using namespace std;
int N, M, P;
int V[NMAX][NMAX], s_min[NMAX][NMAX], s_max[NMAX][NMAX], st_min[NMAX], st_max[NMAX], vf_min, b_min, vf_max, b_max;
pair<int, int> solve(int dx, int dy) {
for (int i = 0; i < N; i++) {
vf_min = vf_max = -1;
b_min = b_max = -1;
for (int j = 0; j < dy - 1; j++) {
int val = V[i][j];
while (vf_min >= b_min && V[i][st_min[vf_min]] >= val)
vf_min--;
st_min[++vf_min] = j;
while (vf_max >= b_max && V[i][st_max[vf_max]] <= val)
vf_max--;
st_max[++vf_max] = j;
}
for (int j = dy - 1; j < M; j++) {
int val = V[i][j];
while (vf_min >= b_min && V[i][st_min[vf_min]] >= val)
vf_min--;
st_min[++vf_min] = j;
if (j - st_min[b_min] >= dy)
b_min++;
s_min[i][j] = V[i][st_min[b_min]];
while (vf_max >= b_max && V[i][st_max[vf_max]] <= val)
vf_max--;
st_max[++vf_max] = j;
if (j - st_max[b_max] >= dy)
b_max++;
s_max[i][j] = V[i][st_max[b_max]];
}
}
int global_diff = INF, nr = 0;
for (int j = dy - 1; j < M; j++) {
vf_min = vf_max = -1;
b_min = b_max = 0;
for (int i = 0; i < dx - 1; i++) {
int val = s_min[i][j];
while(vf_min >= b_min && s_min[st_min[vf_min]][j] >= val)
vf_min--;
st_min[++vf_min] = i;
val = s_max[i][j];
while(vf_max >= b_max && s_max[st_max[vf_max]][j] <= val)
vf_max--;
st_max[++vf_max] = i;
}
for (int i = dx - 1; i < N; i++) {
int val = s_min[i][j];
while(vf_min >= b_min && s_min[st_min[vf_min]][j] >= val)
vf_min--;
st_min[++vf_min] = i;
if (i - st_min[b_min] >= dx)
b_min++;
val = s_max[i][j];
while(vf_max >= b_max && s_max[st_max[vf_max]][j] <= val)
vf_max--;
st_max[++vf_max] = i;
if (i - st_max[b_max] >= dx)
b_max++;
int pos_min = s_min[st_min[b_min]][j];
int pos_max = s_max[st_max[b_max]][j];
if (pos_max - pos_min < global_diff)
global_diff = pos_max - pos_min, nr = 1;
else
if (pos_max - pos_min == global_diff)
nr++;
}
}
return pair<int, int>(global_diff, nr);
}
int main()
{
freopen("struti.in", "r", stdin);
freopen("struti.out", "w", stdout);
scanf("%d %d %d", &N, &M, &P);
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
scanf ("%d", &V[i][j]);
for (int i = 0; i < P; i++) {
int x, y;
scanf ("%d %d", &x, &y);
pair<int, int> res = solve(x, y);
if (x != y) {
pair<int, int> s_res = solve(y, x);
if (s_res.first > res.first);
else if (s_res.first == res.first)
res.second += s_res.second;
else
res = s_res;
}
printf("%d %d\n", res.first, res.second);
}
return 0;
}