Cod sursa(job #1258164)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 8 noiembrie 2014 15:55:15
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <iostream>
#include <fstream>

int a[501][501][10];

int main()
{
  std::ifstream in("plantatie.in");
  std::ofstream out("plantatie.out");

  int n, m;
  in >> n >> m;
  int kl = 0;
  while ((1 << (kl + 1)) <= n) {
    kl++;
  }
  for (int k = 0; k <= kl; ++k) {
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < n; ++j) {
        if (k) {
          int p = 1 << (k - 1);
          a[i][j][k] = a[i][j][k - 1];
          if (i + p < n) {
            a[i][j][k] = std::max(a[i][j][k], a[i + p][j][k - 1]);
            if (j + p < n) {
              a[i][j][k] = std::max(a[i][j][k], a[i + p][j + p][k - 1]);
            }
          }
          if (j + p < n) {
            a[i][j][k] = std::max(a[i][j][k], a[i][j + p][k - 1]);
          }
        } else if (k == 0) {
          in >> a[i][j][0];
        }
      }
    }
  }

  for (int i = 0; i < m; ++i) {
    int ri, ci, l;
    in >> ri >> ci >> l;
    ri--;
    ci--;
    int k = 0;
    while ((1 << (k + 1)) <= l) k++;
    out << std::max(
        std::max(a[ri][ci][k], a[ri + l - (1 << k)][ci][k]),
        std::max(a[ri][ci + l - (1 << k)][k],
                 a[ri + l - (1 << k)][ci + l - (1 << k)][k])) << std::endl;
  }

  in.close();
  out.close();

  return 0;
}