Cod sursa(job #1258173)

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

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

// The square at (l, c) with side 2^k always fits.
int get(int l, int c, int k) {
  if (k == 0 || a[l][c][k]) {
    return a[l][c][k];
  }

  int p = 1 << (k - 1);
  return a[l][c][k] = std::max(
      std::max(get(l, c, k - 1), get(l + p, c, k - 1)),
      std::max(get(l, c + p, k - 1), get(l + p, c + p, k - 1)));
}

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

  int n, m;
  in >> n >> m;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
      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++;
    int delta = l - (1 << k);
    out << std::max(
        std::max(get(ri, ci, k), get(ri + delta, ci, k)),
        std::max(get(ri, ci + delta, k), get(ri + delta, ci + delta, k)))
        << std::endl;
  }

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

  return 0;
}