Pagini recente » Cod sursa (job #381952) | Cod sursa (job #2767320) | Cod sursa (job #1965560) | Cod sursa (job #2491914) | Cod sursa (job #493514)
Cod sursa(job #493514)
#include <fstream>
using namespace std;
#define DIM 1<<10
#define OFE 11
#define INF (1<<31)-1
int A[DIM][DIM], MN[DIM][DIM], MX[DIM][DIM];
int Dm[DIM], DM[DIM];
int M, N, T, H, h, C;
ifstream f1 ("struti.in");
ofstream f2 ("struti.out");
void cit () {
int i, j;
f1 >> M >> N >> T;
for (i=1; i<=M; ++i)
for (j=1; j<=N; ++j)
f1 >> A[i][j];
}
void rzl (int K1, int K2) {
int i, j, pm, um, pM, uM;
for (i = 1; i <= M; ++i) {
pm = pM = 1;
um = uM = 0;
for (j = 1; j <= N; ++j) {
while (pm <= um && A[i][j] <= A[i][Dm[um]]) um--;
while (pM <= uM && A[i][j] >= A[i][DM[uM]]) uM--;
Dm[++um] = j;
DM[++uM] = j;
if (Dm[pm] <= j-K1) pm++;
if (DM[pM] <= j-K1) pM++;
MN[i][j] = A[i][Dm[pm]];
MX[i][j] = A[i][DM[pM]];
}
}
for (j = K1; j <= N; ++j) {
pm = pM = 1;
um = uM = 0;
for (i = 1; i <= M; ++i) {
while (pm <= um && MN[i][j] <= MN[Dm[um]][j]) um--;
while (pM <= uM && MX[i][j] >= MX[DM[uM]][j]) uM--;
Dm[++um] = i;
DM[++uM] = i;
if (Dm[pm] <= i-K2) pm++;
if (DM[pM] <= i-K2) pM++;
if (i >= K2) {
h = MX[DM[pM]][j] - MN[Dm[pm]][j];
if (h < H) H = h, C = 1;
else if (h == H) C++;
}
}
}
}
void parc () {
int K1, K2;
for (int t=0; t<T; ++t) {
f1 >> K1 >> K2;
H = INF, C = 0;
rzl (K1, K2);
if (K1 != K2)
rzl (K2, K1);
f2 << H << ' ' << C << '\n';
}
}
int main () {
cit ();
parc ();
f1.close ();
f2.close ();
return 0;
}