Cod sursa(job #2286768)

Utilizator ApostolIlieDanielApostol Daniel ApostolIlieDaniel Data 20 noiembrie 2018 18:28:03
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;

FILE *fin = fopen ("plantatie.in", "r"), *fout = fopen ("plantatie.out", "w");

const int MAXN = 512;

int d[MAXN + 1][MAXN + 1][10];

void compute () {
  int k, i, j;
  for (k = 1; k <= 9; k++)
    for (i = 1; i + (1 << k) <= MAXN; i++)
      for (j = 1; j + (1 << k) <= MAXN; j++)
        d[i][j][k] = max (d[i][j][k - 1],
         max (d[i + (1 << k) / 2][j][k - 1],
         max (d[i][j + (1 << k) / 2][k - 1],
         d[i + (1 << k) / 2][j + (1 << k) / 2][k - 1])));
}

int ow (int k) {
  int sol = 1;
  while (sol * 2 <= k)
    sol = sol * 2;
  return sol;
}

int lg (int n) {
  int sol = 0;
  while (n > 1) {
    sol++;
    n = n / 2;
  }
  return sol;
}

int solve (int x, int y, int k) {
  int tolg = ow (k);
  return max (d[x][y][lg (tolg)], max (d[x + k - tolg][y][lg (tolg)], max (d[x][y + k - tolg][lg (tolg)], d[x + k - tolg][y + k - tolg][lg (tolg)])));
}

int main() {
  int n, m, i, j, x, y, k;
  fscanf (fin, "%d%d", &n, &m);

  for (i = 1; i <= n; i++)
    for (j = 1; j <= n; j++)
      fscanf (fin, "%d", &d[i][j][0]);
  compute ();
 // d[1][1][9] = compute (1, 1, 9);
  //fprintf (fout, "%d\n", d[1][1][3]);
  while (m--) {
    fscanf (fin, "%d%d%d", &x, &y, &k);
    fprintf (fout, "%d\n", solve (x, y, k));
  }

  fclose (fin);
  fclose (fout);
  return 0;
}