Cod sursa(job #1258095)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 8 noiembrie 2014 14:20:02
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <iostream>
#include <fstream>
#include <algorithm>

#define MAXN 500

int n, m;
int a[MAXN + 1][MAXN + 1];
int v[1 + 16 * MAXN * MAXN];

int set_elem(int node, int ri, int rf, int ci, int cf) {
  if (ri > rf || ci > cf) return 0;

  if (ri == rf && ci == cf) {
    return v[node] = a[ri][ci];
  }

  int rm = (ri + rf) / 2;
  int cm = (ci + cf) / 2;
  return v[node] = std::max(
      std::max(set_elem(node * 4 - 2, ri, rm, ci, cm),
               set_elem(node * 4 - 1, ri, rm, cm + 1, cf)),
      std::max(set_elem(node * 4 - 0, rm + 1, rf, ci, cm),
               set_elem(node * 4 + 1, rm + 1, rf, cm + 1, cf)));
}

int get_elem(int node, int ri, int rf, int ci, int cf,
              int rqi, int rqf, int cqi, int cqf) {
  // No overlap.
  if (ri > rf || ci > cf) return 0;
  if (rqf < ri || rqi > rf || cqf < ci || cqf > cf) return 0;

  // Complete inclusion.
  if (rqi <= ri && rqf >= rf && cqi <= ci && cqf >= cf) {
    return v[node];
  }

  // Break it up.
  int rm = (ri + rf) / 2;
  int cm = (ci + cf) / 2;
  return std::max(
      std::max(
          get_elem(node * 4 - 2, ri, rm, ci, cm, rqi, rqf, cqi, cqf),
          get_elem(node * 4 - 1, ri, rm, cm + 1, cf, rqi, rqf, cqi, cqf)),
      std::max(
          get_elem(node * 4 - 0, rm + 1, rf, ci, cm, rqi, rqf, cqi, cqf),
          get_elem(node * 4 + 1, rm + 1, rf, cm + 1, cf, rqi, rqf, cqi, cqf)));
}

inline int get(int rqi, int rqf, int cqi, int cqf) {
  return get_elem(1, 1, n, 1, n, rqi, rqf, cqi, cqf);
}

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

  int x;
  in >> n >> m;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      in >> a[i][j];
    }
  }
  set_elem(1, 1, n, 1, n);

  for (int i = 0; i < m; ++i) {
    int ri, ci, s;
    in >> ri >> ci >> s;
    out << get(ri, ri + s - 1, ci, ci + s - 1) << std::endl;
  }

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

  return 0;
}