Cod sursa(job #1673486)

Utilizator stoianmihailStoian Mihail stoianmihail Data 3 aprilie 2016 21:08:25
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#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;
}