Cod sursa(job #2151478)

Utilizator DruffbaumPopescu Vlad Druffbaum Data 4 martie 2018 15:41:27
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <cstdio>

const int MAXN = 5e2;
#define MAXLOG 10

int rmq[MAXN + 1][MAXN + 1][MAXLOG + 1], lg[MAXLOG + 1], p2[MAXLOG + 1];

static inline int max(int a, int b) {
  return a > b ? a : b;
}

int main() {
  FILE *fin, *fout;
  int n, m, x, y, k, p;
  fin = fopen("plantatie.in", "r");
  fscanf(fin, "%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      fscanf(fin, "%d", &rmq[i][j][0]);
    }
  }
  for (int i = 2; i <= n; ++i) {
    lg[i] = lg[i >> 1] + 1;
  }
  p2[0] = 1;
  for (int i = 1; i <= lg[n]; ++i) {
    p2[i] = p2[i - 1] << 1;
  }
  for (int k = 1; k <= lg[n]; ++k) {
    for (int i = 1; i + p2[k - 1] <= n; ++i) {
      for (int j = 1; j + p2[k - 1] <= n; ++j) {
        rmq[i][j][k] = max(rmq[i][j][k - 1], max(rmq[i + p2[k - 1]][j][k - 1], 
                       max(rmq[i][j + p2[k - 1]][k - 1], rmq[i + p2[k - 1]][j + p2[k - 1]][k - 1])));
      }
    }
  }
  fout = fopen("plantatie.out", "w");
  for (int i = 0; i < m; ++i) {
    fscanf(fin, "%d%d%d", &x, &y, &k);
    p = lg[k];
    fprintf(fout, "%d\n", max(rmq[x][y][p], max(rmq[x + k - p2[p]][y][p], 
                          max(rmq[x][y + k - p2[p]][p], rmq[x + k - p2[p]][y + k - p2[p]][p]))));
  }
  fclose(fin);
  fclose(fout);
  return 0;
}