Cod sursa(job #1258157)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 8 noiembrie 2014 15:47:09
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 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;
  for (int k = 0; k < 10; ++k) {
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < n; ++j) {
        if (k) {
          a[i][j][k] = a[i][j][k - 1];
          if (i + (1 << (k - 1)) < n) {
            a[i][j][k] = std::max(a[i][j][k], a[i + (1 << (k - 1))][j][k - 1]);
          }
          if (j + (1 << (k - 1)) < n) {
            a[i][j][k] = std::max(a[i][j][k], a[i][j + (1 << (k - 1))][k - 1]);
          }
          if (i + (1 << (k - 1)) < n && j + (1 << (k - 1)) < n) {
            a[i][j][k] =
                std::max(a[i][j][k],
                         a[i + (1 << (k - 1))][j + (1 << (k - 1))][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;
}