Cod sursa(job #2929759)

Utilizator raresgherasaRares Gherasa raresgherasa Data 26 octombrie 2022 20:04:32
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;

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

const int kN = 5e2 + 5;
const int kL = 10;

int m[kN][kN][kL], lg[kN];
int n, q;

int solve (int x1, int y1, int x2, int y2){
  int ans = -INT_MAX, k = lg[x2 - x1 + 1];
  ans = max(ans, m[x1][y1][k]);
  ans = max(ans, m[x2 - (1 << k) + 1][y1][k]);
  ans = max(ans, m[x1][y2 - (1 << k) + 1][k]);
  ans = max(ans, m[x2 - (1 << k) + 1][y2 - (1 << k) + 1][k]);
  return ans;
}

int main(){
  fin >> n >> q;
  for (int i = 1; i <= n; i++){
    for (int j = 1; j <= n; j++){
      int x; fin >> x;
      m[i][j][0] = x;
    }
  }
  for (int j = 1; j < kL; j++){
    for (int i = 1; i + (1 << j) - 1 <= n; i++){
      for (int k = 1; k + (1 << j) - 1 <= n; k++){
        m[i][k][j] = max(m[i][k][j - 1], m[i + (1 << (j - 1))][k][j - 1]);
        m[i][k][j] = max(m[i][k][j], m[i][k + (1 << (j - 1))][j - 1]);
        m[i][k][j] = max(m[i][k][j], m[i + (1 << (j - 1))][k + (1 << (j - 1))][j - 1]);
      }
    }
  }

  lg[1] = 0;
  for (int i = 2; i < kN; i++){
    lg[i] = lg[i / 2] + 1;
  }

  while (q--){
    int i, j, k; fin >> i >> j >> k;
    fout << solve(i, j, i + k - 1, j + k - 1) << '\n';
  }
}