Cod sursa(job #3232362)

Utilizator sstanciu44Stanciu Sebastian sstanciu44 Data 30 mai 2024 02:30:03
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("plantatie.in");
ofstream g("plantatie.out");

void calculate_logs(vector<int>& lg, int length) {
  lg[1] = 0;
  for(int i = 2; i <= length; ++i)
    lg[i] = lg[i >> 1] + 1;
}

int main() {
  int n, m, i, j, k, x, y, max_R1, max_R2;
  f >> n >> m;
  vector<int> lg(n + 1);
  calculate_logs(lg, n);
  vector<vector<int>> arr(n, vector<int>(n));
  vector<vector<vector<int>>> sp_table(lg[n] + 1, vector<vector<int>>(n, vector<int>(n)));
  for(i = 0; i < n; ++i)
    for(j = 0; j < n; ++j)
      f >> sp_table[0][i][j];
  for(i = 1; i <= lg[n]; ++i)
    for(j = 0; j + (1 << (i - 1)) < n; ++j)
      for(k = 0; k + (1 << (i - 1)) < n; ++k) {
        max_R1 = max(sp_table[i - 1][j][k], sp_table[i - 1][j][k + (1 << (i - 1))]);
        max_R2 = max(sp_table[i - 1][j + (1 << (i - 1))][k], sp_table[i - 1][j + (1 << (i - 1))][k + (1 << (i - 1))]);
        sp_table[i][j][k] = max(max_R1, max_R2);
      }
  for(i = 0; i < m; ++i) {
    f >> x >> y >> k;
    --x;
    --y;
    int log = lg[k];
    max_R1 = max(sp_table[log][x][y], sp_table[log][x][y + k - (1 << log)]);
    max_R2 = max(sp_table[log][x + k - (1 << log)][y], sp_table[log][x + k - (1 << log)][y + k - (1 << log)]);
    g << max(max_R1, max_R2) << '\n';
  }
  return 0;
}