Cod sursa(job #949161)

Utilizator toranagahVlad Badelita toranagah Data 12 mai 2013 18:03:32
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 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;
}