Pagini recente » Cod sursa (job #423362) | Cod sursa (job #900506) | Cod sursa (job #224312) | Cod sursa (job #340309) | Cod sursa (job #1053699)
#include<fstream>
using namespace std;
#define dim 1001
ifstream fi("struti.in");
ofstream fo("struti.out");
int l1, l2, f1, f2, nr, minim, a[dim][dim], b[dim][dim], d1[dim], d2[dim], n, m, k, i, j, x, y, c[dim][dim];
int main(){
fi >> n >> m >> k;
for (i = 1; i <= n; ++i)
for (j = 1; j <= m; ++j)
fi >> a[i][j];
for (i = 1; i <= n; ++i)
b[i][1] = c[i][1] = a[i][1];
for (int o = 1; o <= k; ++o){
fi >> x >> y;
nr = 0;
minim = 9000;
for (i = 1; i <= n; ++i){
d1[1] = d2[1] = l1 = l2 = f1 = f2 = 1;
for (j = 2; j <= m; ++j){
while (l1 >= f1&&a[i][d1[l1]] >= a[i][j])
l1--;
d1[++l1] = j;
while (d1[f1] + x <= j)
f1++;
while (l2 >= f2&&a[i][d2[l2]] <= a[i][j])
l2--;
d2[++l2] = j;
while (d2[f2] + x <= j)
f2++;
b[i][j] = a[i][d2[f2]];
c[i][j] = a[i][d1[f1]];
}
}
for (j = x; j <= m; ++j){
d2[1] = l2 = f2 = d1[1] = l1 = f1 = 1;
for (i = 2; i <= n; ++i){
while (l1 >= f1&&c[d1[l1]][j] >= c[i][j])
l1--;
d1[++l1] = i;
while (d1[f1] + y <= i)
f1++;
while (l2 >= f2&&b[d2[l2]][j] <= b[i][j])
l2--;
d2[++l2] = i;
while (d2[f2] + y <= i)
f2++;
if (i >= y)
if (minim>b[d2[f2]][j] - c[d1[f1]][j]){
minim = b[d2[f2]][j] - c[d1[f1]][j];
nr = 1;
}
else if (minim == b[d2[f2]][j] - c[d1[f1]][j])
nr++;
}
}
if (x != y){
for (i = 1; i <= n; ++i){
d1[1] = d2[1] = l1 = l2 = f1 = f2 = 1;
for (j = 2; j <= m; ++j){
while (l1 >= f1&&a[i][d1[l1]] >= a[i][j])
l1--;
d1[++l1] = j;
while (d1[f1] + y <= j)
f1++;
while (l2 >= f2&&a[i][d2[l2]] <= a[i][j])
l2--;
d2[++l2] = j;
while (d2[f2] + y <= j)
f2++;
b[i][j] = a[i][d2[f2]];
c[i][j] = a[i][d1[f1]];
}
}
for (j = y; j <= m; ++j){
d2[1] = l2 = f2 = d1[1] = l1 = f1 = 1;
for (i = 2; i <= n; ++i){
while (l1 >= f1&&c[d1[l1]][j] >= c[i][j])
l1--;
d1[++l1] = i;
while (d1[f1] + x <= i)
f1++;
while (l2 >= f2&&b[d2[l2]][j] <= b[i][j])
l2--;
d2[++l2] = i;
while (d2[f2] + x <= i)
f2++;
if (i >= x)
if (minim>b[d2[f2]][j] - c[d1[f1]][j]){
minim = b[d2[f2]][j] - c[d1[f1]][j];
nr = 1;
}
else if (minim == b[d2[f2]][j] - c[d1[f1]][j])
nr++;
}
}
}
fo << minim << ' ' << nr << '\n';
}
fo.close();
fi.close();
return 0;
}