Pagini recente » Cod sursa (job #1691761) | Cod sursa (job #383335) | Cod sursa (job #1192837) | Cod sursa (job #2364450) | Cod sursa (job #1082198)
#include <fstream>
using namespace std;
const int Nmax = 1024;
const int Inf = 1 << 30;
ifstream f("struti.in");
ofstream g("struti.out");
int mat[Nmax][Nmax], a[Nmax][Nmax], b[Nmax][Nmax];
int dq_min[Nmax], dq_max[Nmax];
int n, m, t, dx, dy, sol, nr_sol;
void solve() {
int i, k, lin, col, f_dq_min, f_dq_max, l_dq_min, l_dq_max, max_val,
min_val;
for (lin = 1; lin <= n; lin++) {
k = dy;
f_dq_min = 1;
l_dq_min = 0;
f_dq_max = 1;
l_dq_max = 0;
for (i = 1; i <= m; i++) {
while (f_dq_min <= l_dq_min
and mat[lin][i] <= mat[lin][dq_min[l_dq_min]])
l_dq_min--;
while (f_dq_max <= l_dq_max
and mat[lin][i] >= mat[lin][dq_max[l_dq_max]])
l_dq_max--;
dq_min[++l_dq_min] = i, dq_max[++l_dq_max] = i;
if (dq_min[f_dq_min] == i - k)
f_dq_min++;
if (dq_max[f_dq_max] == i - k)
f_dq_max++;
if (i >= k) {
a[lin][i] = mat[lin][dq_min[f_dq_min]];
b[lin][i] = mat[lin][dq_max[f_dq_max]];
}
}
}
for (col = dy; col <= m; col++) {
k = dx;
f_dq_min = 1, l_dq_min = 0;
f_dq_max = 1, l_dq_max = 0;
for (i = 1; i <= n; i++) {
while (f_dq_min <= l_dq_min
and a[i][col] <= a[dq_min[l_dq_min]][col])
l_dq_min--;
while (f_dq_max <= l_dq_max
and b[i][col] >= b[dq_max[l_dq_max]][col])
l_dq_max--;
dq_min[++l_dq_min] = i, dq_max[++l_dq_max] = i;
if (dq_min[f_dq_min] == i - k)
f_dq_min++;
if (dq_max[f_dq_max] == i - k)
f_dq_max++;
if (i >= k) {
min_val = a[dq_min[f_dq_min]][col];
max_val = b[dq_max[f_dq_max]][col];
}
if (i >= dx) {
if (max_val - min_val < sol) {
sol = max_val - min_val;
nr_sol = 1;
} else if (max_val - min_val == sol)
nr_sol++;
}
}
}
}
int main() {
int i, j, aux;
f >> n >> m >> t;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
f >> mat[i][j];
while (t--) {
f >> dx >> dy;
sol = Inf, nr_sol = 0;
solve();
if (dx != dy) {
aux = dx;
dx = dy;
dy = aux;
solve();
}
g << sol << " " << nr_sol << "\n";
}
f.close();
g.close();
return 0;
}