Cod sursa(job #961069)

Utilizator primulDarie Sergiu primul Data 11 iunie 2013 16:49:33
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <algorithm>
#include <fstream>
#include <iostream>
using namespace std;
 
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
 
const int MAX_N = 505;
const int MAX_LOG = 15;
 
int rm[MAX_LOG][MAX_N][MAX_N];
int log_2[MAX_N];
 
 
int main() {
  int N, M;
  fin >> N >> M;
  for (int i = 1; i <= N; ++i) {
    for (int j = 1; j <= N; ++j) {
      fin >> rm[0][i][j];
    }
  }
 
  for (int l = 1; (1 << l) <= N; ++l) {
    for (int i = 1; i + (1 << l) - 1 <= N; ++i) {
      for (int j = 1; j + (1 << l) - 1 <= N; ++j) {
        rm[l][i][j] = max(
            max(
                rm[l - 1][i + (1 << (l - 1))][j],
                rm[l - 1][i][j + (1 << (l - 1))]),
            max(
                rm[l - 1][i][j],
                rm[l - 1][i + (1 << (l - 1))][j + (1 << (l - 1))]));
      }
    }
  }
 
  log_2[1] = 0;
  for (int i = 2; i <= N; ++i) {
    log_2[i] = log_2[i / 2] + 1;
  }
 
  for (int i = 1, x, y, h; i <= M; ++i) {
    fin >> x >> y >> h;
    int k = log_2[h];
    fout << max(
        max(
            rm[k][x][y],
            rm[k][x + h - (1 << k)][y + h - (1 << k)]),
        max(
            rm[k][x + h - (1 << k)][y],
            rm[k][x][y + h - (1 << k)]));
    fout << '\n';
  }
  return 0;
}