Pagini recente » Cod sursa (job #2796789) | Cod sursa (job #88041) | Cod sursa (job #2273340) | Cod sursa (job #2154958) | Cod sursa (job #2674798)
#include <iostream>
#include <cstdio>
#include <deque>
using namespace std;
struct poz {
int i, j;
poz(int _i = 0, int _j = 0) : i(_i), j(_j) {}
};
const int NMAX = 1000;
const int DIFMAX = 8000;
int n, m, p;
int a[NMAX + 5][NMAX + 5], minc[NMAX + 5][NMAX + 5], maxc[NMAX + 5][NMAX + 5];
int col_min[NMAX + 5], col_max[NMAX + 5];
int crt_min[NMAX + 5], crt_max[NMAX + 5];
int st0, dr0, st1, dr1, st2, dr2, st3, dr3;
void solve(int dx, int dy, int &min_dif, int &nrap) {
min_dif = DIFMAX + 5;
nrap = 0;
for(int j = 1; j <= m; ++j) {
st0 = st1 = 0;
dr0 = dr1 = -1;
for(int i = 1; i <= n; ++i) {
if(dr0 >= st0 && col_min[st0] == i - dx) st0++;
while(dr0 >= st0 && a[i][j] <= a[col_min[dr0]][j]) dr0--;
col_min[++dr0] = i;
minc[i][j] = a[col_min[st0]][j];
if(dr1 >= st1 && col_max[st1] == i - dx) st1++;
while(dr1 >= st1 && a[i][j] >= a[col_max[dr1]][j]) dr1--;
col_max[++dr1] = i;
maxc[i][j] = a[col_max[st1]][j];
}
}
for(int i = dx; i <= n; i++) {
st2 = st3 = 0;
dr2 = dr3 = -1;
for(int j = 1; j <= m; j++) {
if(dr2 >= st2 && crt_min[st2] == j - dy) st2++;
while(dr2 >= st2 && minc[i][j] <= minc[i][crt_min[dr2]]) dr2--;
crt_min[++dr2] = j;
if(dr3 >= st3 && crt_max[st3] == j - dy) st3++;
while(dr3 >= st3 && maxc[i][j] >= maxc[i][crt_max[dr3]]) dr3--;
crt_max[++dr3] = j;
if(j >= dy) {
int dif = maxc[i][crt_max[st3]] - minc[i][crt_min[st2]];
if(dif == min_dif) nrap++;
else if(dif < min_dif) {
min_dif = dif;
nrap = 1;
}
}
}
}
}
int main() {
freopen("struti.in", "r", stdin);
freopen("struti.out", "w", stdout);
scanf("%d %d %d", &n, &m, &p);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
scanf("%d", &a[i][j]);
int l1, l2, dif1, dif2;
int n1, n2;
while(p--) {
scanf("%d", &l1);
scanf("%d", &l2);
dif1 = dif2 = DIFMAX + 5;
n1 = n2 = 0;
solve(l1, l2, dif1, n1);
if(l2 != l1)
solve(l2, l1, dif2, n2);
if(dif1 == dif2)
printf("%d %d\n", dif1, n1 + n2);
else
printf("%d %d\n", (dif1 < dif2) ? dif1 : dif2, (dif1 < dif2) ? n1 : n2);
}
return 0;
}