Pagini recente » Cod sursa (job #2048812) | Cod sursa (job #2741775) | Cod sursa (job #244766) | Cod sursa (job #2757528) | Cod sursa (job #2674787)
#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];
int col_min[NMAX + 5][NMAX + 5], col_max[NMAX + 5][NMAX + 5];
poz crt_min[NMAX + 5], crt_max[NMAX + 5];
int st0[NMAX + 5], dr0[NMAX + 5], st1[NMAX + 5], dr1[NMAX + 5], st2, dr2, st3, dr3;
void solve(int dx, int dy, int &min_dif, int &nrap) {
for(int j = 1; j <= m; ++j) {
st0[j] = st1[j] = 0;
dr0[j] = dr1[j] = -1;
}
min_dif = DIFMAX + 5;
nrap = 0;
for(int i = 1; i <= n; ++i) {
st2 = st3 = 0;
dr2 = dr3 = -1;
for(int j = 1; j <= m; ++j) {
if(dr0[j] >= st0[j] && col_min[j][st0[j]] == i - dx) ++st0[j];
while(dr0[j] >= st0[j] && a[i][j] <= a[col_min[j][dr0[j]]][j]) --dr0[j];
col_min[j][++dr0[j]] = i;
int minim = col_min[j][st0[j]];
if(dr1[j] >= st1[j] && col_max[j][st1[j]] == i - dx) ++st1[j];
while(dr1[j] >= st1[j] && a[i][j] >= a[col_max[j][dr1[j]]][j]) --dr1[j];
col_max[j][++dr1[j]] = i;
int maxim = col_max[j][st1[j]];
if(i >= dx) {
if(dr2 >= st2 && crt_min[st2].j == j - dy) ++st2;
while(dr2 >= st2 && a[minim][j] <= a[crt_min[dr2].i][crt_min[dr2].j]) --dr2;
crt_min[++dr2].i = minim;
crt_min[dr2].j = j;
if(dr3 >= st3 && crt_max[st3].j == j - dy) ++st3;
while(dr3 >= st3 && a[maxim][j] >= a[crt_max[dr3].i][crt_max[dr3].j]) --dr3;
crt_max[++dr3].i = maxim;
crt_max[dr3].j = j;
}
if(i >= dx && j >= dy) {
minim = a[crt_min[st2].i][crt_min[st2].j];
maxim = a[crt_max[st3].i][crt_max[st3].j];
if(maxim - minim == min_dif) ++nrap;
else if(maxim - minim < min_dif) {
min_dif = maxim - minim;
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;
}