Cod sursa(job #2674272)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 18 noiembrie 2020 21:21:07
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <iostream>
#include <cstdio>

using namespace std;

const int NMAX = 500;
const int LOG2 = 8;

int n, m;
int log2[NMAX + 1];
int rmq[LOG2 + 1][NMAX + 1][NMAX + 1];

void gen_log2() {
  for(int i = 2; i <= n; ++i)
    log2[i] = log2[i >> 1] + 1;
}

void gen_rmq() {
  for(int l2 = 1; l2 <= log2[n]; l2++) {
    int l = 1 << l2;
    for(int i = 1; i + l - 1 <= n; i++)
      for(int j = 1; j + l - 1 <= n; j++)
        rmq[l2][i][j] = max(max(rmq[l2 - 1][i][j], rmq[l2 - 1][i][j + l / 2]),
                            max(rmq[l2 - 1][i + l / 2][j], rmq[l2 - 1][i + l / 2][j + l / 2]));
  }
}

int query(int i, int j, int k) {
  int l2 = log2[k], l = 1 << l2;
  return max(max(rmq[l2][i][j], rmq[l2][i][j + k - l]),
             max(rmq[l2][i + k - l][j], rmq[l2][i + k - l][j + k - l]));
}

int main() {
  freopen("plantatie.in", "r", stdin);
  freopen("plantatie.out", "w", stdout);

  scanf("%d %d", &n, &m);
  gen_log2();
  for(int i = 1; i <= n; ++i)
    for(int j = 1; j <= n; ++j)
      scanf("%d", &rmq[0][i][j]);
  gen_rmq();

  int x, y, z;
  for(int i = 1; i <= m; i++) {
    scanf("%d %d %d", &x, &y, &z);
    printf("%d\n", query(x, y, z));
  }

  return 0;
}