Cod sursa(job #3230205)

Utilizator izabelamariaJilavu Izabela izabelamaria Data 19 mai 2024 21:47:15
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <iostream>
#include <fstream>
#include <cmath>
#define NMAX 502
#define LOGN 10

using namespace std;

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

int n, m;
int rmq[NMAX][NMAX][LOGN][LOGN];

void computeRMQ() {
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      fin >> rmq[i][j][0][0];
    }

  for (int k = 1; k <= LOGN; k++) 
    for (int i = 1; i + (1 << k) - 1 <= n; i++) 
      for (int j = 1; j <= n; j++) {
        rmq[i][j][k][0] = max(rmq[i][j][k - 1][0], rmq[i + (1 << (k - 1))][j][k - 1][0]);
      }

  for (int k = 1; k <= LOGN; k++) 
    for (int i = 1; i <= n; i++)
      for (int j = 1; j + (1 << k) - 1 <= n; j++) {
        rmq[i][j][0][k] = max(rmq[i][j][0][k - 1], rmq[i][j + (1 << (k - 1))][0][k - 1]);
      }

  for (int k = 1; k <= LOGN; k++)
    for (int l = 1; l <= LOGN; l++) 
      for (int i = 1; i + (1 << k) - 1 <= n; i++)
        for (int j = 1; j + (1 << l) - 1 <= n; j++) {
          rmq[i][j][k][l] = max(max(rmq[i][j][k - 1][l - 1],
              rmq[i + (1 << (k - 1))][j][k - 1][l - 1]), 
              max(rmq[i][j + (1 << (l - 1))][k - 1][l - 1], rmq[i + (1 << (k - 1))][j + (1 << (l - 1))][k - 1][l - 1]));
        }
}

int query(int x1, int y1, int x2, int y2) {
  int k = log2(x2 - x1 + 1);
  int l = log2(y2 - y1 + 1);

  return max(max(rmq[x1][y1][k][l], rmq[x2 - (1 << k) + 1][y1][k][l]), max(rmq[x1][y2 - (1 << l) + 1][k][l], rmq[x2 - (1 << k) + 1][y2 - (1 << l) + 1][k][l]));
}

int main() {
  fin >> n >> m;
  
  computeRMQ();

  for (int i = 1; i <= m; i++) {
    int x, y, k;
    fin >> x >> y >> k;
    int x2 = x + k - 1;
    int y2 = y + k - 1;
    fout << query(x, y, x2, y2) << '\n';
  }
}