Cod sursa(job #1258206)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 8 noiembrie 2014 16:40:13
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <iostream>
#include <fstream>
#include <algorithm>

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

int main()
{
  FILE* in = fopen("plantatie.in", "r");
  FILE* out = fopen("plantatie.out", "w");

  int n, m;
  fscanf(in, "%d%d", &n, &m);
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
      fscanf(in, "%d", &a[i][j][0]);
    }
  }

  for (int i = 2; i <= 500; ++i) lg2pre[i] = lg2pre[i / 2] + 1;

  for (int k = 1; k <= lg2pre[n]; ++k) {
    int q = 1 << (k - 1);
    for (int i = 0; i < n - q; ++i) {
      for (int j = 0; j < n - q; ++j) {
        a[i][j][k] =
            std::max(std::max(a[i][j][k - 1], a[i + q][j][k - 1]),
                     std::max(a[i][j + q][k - 1], a[i + q][j + q][k - 1]));
      }
    }
  }

  for (int i = 0; i < m; ++i) {
    int ri, ci, l;
    fscanf(in, "%d%d%d", &ri, &ci, &l);
    ri--;
    ci--;
    int k = lg2pre[l];
    int delta = l - (1 << lg2pre[l]);
    fprintf(out, "%d\n", std::max(
        std::max(a[ri][ci][k], a[ri + delta][ci][k]),
        std::max(a[ri][ci + delta][k], a[ri + delta][ci + delta][k])));
  }

  fclose(in);
  fclose(out);

  return 0;
}