Pagini recente » Cod sursa (job #2210794) | Cod sursa (job #836857) | Cod sursa (job #1156686) | Cod sursa (job #67485) | Cod sursa (job #1673486)
#include <stdio.h>
#define Nadejde 500
#define Smerenie 8
int N, M;
int rmq[Smerenie + 1][Nadejde + 1][Nadejde + 1];
/** Precalculare. **/
int lg[Nadejde + 1];
int shl[Smerenie + 1];
/** max - 2 elemente. **/
int max(int X, int Y) {
return X > Y ? X : Y;
}
/** max - 4 elemente. **/
int MAX(int X, int Y, int Z, int W) {
return max(max(X, Y), max(Z, W));
}
/** Initializeaza "shl" si "lg". **/
void init() {
int i;
for (i = 0; i <= Smerenie; i++) {
shl[i] = (1 << i);
}
lg[1] = 0;
for (i = 2; i <= N; i++) {
lg[i] = 1 + lg[i >> 1];
}
}
/** Construieste RMQ. **/
void preprocessing() {
int k, i, j;
for (k = 1; k <= Smerenie; k++) {
for (i = 1; i <= N; i++) {
for (j = 1; j <= N; j++) {
rmq[k][i][j] = MAX
(
rmq[k - 1][i][j],
rmq[k - 1][i + shl[k - 1]][j],
rmq[k - 1][i][j + shl[k - 1]],
rmq[k - 1][i + shl[k - 1]][j + shl[k - 1]]
);
}
}
}
}
/** Da-mi raspunsul pentru intrebarea curenta. **/
int getAnswer(int i, int j, int k) {
return MAX
(
rmq[lg[k]][i][j],
rmq[lg[k]][i + k - shl[lg[k]]][j],
rmq[lg[k]][i][j + k - shl[lg[k]]],
rmq[lg[k]][i + k - shl[lg[k]]][j + k - shl[lg[k]]]
);
}
int main(void) {
int i, j, k;
FILE *f = fopen("plantatie.in", "r");
/* Citirea datelor. */
fscanf(f, "%d %d", &N, &M);
for (i = 1; i <= N; i++) {
for (j = 1; j <= N; j++) {
fscanf(f, "%d", &rmq[0][i][j]);
}
}
/* Calcularea solutiei. */
init();
preprocessing();
/* Raspunde la intrebari. */
freopen("plantatie.out", "w", stdout);
while (M) {
fscanf(f, "%d %d %d", &i, &j, &k);
fprintf(stdout, "%d\n", getAnswer(i, j, k));
M--;
}
fclose(f);
fclose(stdout);
/// Multumim Doamne!
puts("Doamne ajuta!");
return 0;
}