Cod sursa(job #2442220)

Utilizator Iulia25Hosu Iulia Iulia25 Data 23 iulie 2019 12:45:45
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>

using namespace std;

ifstream fin ("plantatie.in");
ofstream fout ("plantatie.out");

int n, m, k, a[505][505], L[505], V[15];
int Max[505][505][15], ls, lj, cs, cj;

int main()  {
  fin >> n >> m;
  for (int i = 1; i <= n; ++i)  {
    for (int j = 1; j <= n; ++j)  {
      fin >> a[i][j];
      Max[i][j][1] = a[i][j];
    }
  }
  for (int l = 2, k = 1; k <= n; ++l, k <<= 1)  {
    for (int i = 1; i <= n - 2 * k + 1; ++i)  {
      for (int j = 1; j <= n - 2 * k + 1; ++j)  {
        int dreapta = max(Max[i][j + k][l - 1], Max[i + k][j + k][l - 1]);
        int stanga = max(Max[i][j][l - 1], Max[i + k][j][l - 1]);
        Max[i][j][l] = max(stanga, dreapta);
      }
    }
  }
  int J = 0;
  for (int i = 1; i <= 500; i <<= 1)  {
    L[i] = ++J;
    V[J] = i;
  }
  for (int i = 1; i <= 500; ++i)
    if (!L[i])
      L[i] = L[i - 1];
  for (int i = 1; i <= m; ++i)  {
    fin >> ls >> cs >> k;
    lj = ls + k - 1;
    cj = cs + k - 1;
    int dreapta = max(Max[ls][cj - V[L[k]] + 1][L[k]], Max[lj - V[L[k]] + 1][cj - V[L[k]] + 1][L[k]]);
    int stanga = max(Max[ls][cs][L[k]], Max[lj - V[L[k]] + 1][cs][L[k]]);
    fout << max(stanga, dreapta) << '\n';
  }
  return 0;
}