Pagini recente » Cod sursa (job #2100558) | Cod sursa (job #1712344) | Cod sursa (job #1005512) | Cod sursa (job #129172) | Cod sursa (job #1082212)
#include <cstdio>
#include <cctype>
using namespace std;
const int Nmax = 1024;
const int Inf = 1 << 30;
const int BuffSize = 8192;
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;
int pos = BuffSize;
char buff[BuffSize];
inline char getChar(FILE *f) {
if (pos == BuffSize) {
fread(buff, 1, BuffSize, f);
pos = 0;
}
return buff[pos++];
}
inline int read(FILE *f) {
int result = 0;
char c;
do {
c = getChar(f);
} while (!isdigit(c));
do {
result = 10 * result + c - '0';
c = getChar(f);
} while (isdigit(c));
return result;
}
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() {
FILE *f = fopen("struti.in", "r");
FILE *g = fopen("struti.out", "w");
int i, j, aux;
n = read(f);
m = read(f);
t = read(f);
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
mat[i][j] = read(f);
while (t--) {
dx = read(f);
dy = read(f);
sol = Inf, nr_sol = 0;
solve();
if (dx != dy) {
aux = dx;
dx = dy;
dy = aux;
solve();
}
fprintf(g, "%d %d\n", sol, nr_sol);
}
fclose(f);
fclose(g);
return 0;
}