Cod sursa(job #3232320)

Utilizator sstanciu44Stanciu Sebastian sstanciu44 Data 29 mai 2024 21:43:38
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <bits/stdc++.h>
using namespace std;

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

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

int main() {
  long long n, m, i, j, x, y, k, l, c, 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<vector<long long>>>> sp_table(lg[n] + 1, vector<vector<vector<long long>>>(n, vector<vector<long long>>(lg[n] + 1, vector<long long>(n))));
  for(i = 0; i < n; ++i)
    for(j = 0; j < n; ++j)
      f >> sp_table[0][i][0][j];
  for(l = 0; l < n; ++l)
    for(i = 1; i <= lg[n]; ++i)
      for(j = 0; j + (1 << (i - 1)) < n; ++j)
        sp_table[0][l][i][j] = max(sp_table[0][l][i - 1][j], sp_table[0][l][i - 1][j + (1 << (i - 1))]);
  for(i = 1; i <= lg[n]; ++i)
    for(j = 0; j + (1 << (i - 1)) < n; ++j)
      for(l = 0; l <= lg[n]; ++l)
        for(c = 0; c < n; ++c)
          sp_table[i][j][l][c] = max(sp_table[i - 1][j][l][c], sp_table[i - 1][j + (1 << (i - 1))][l][c]);
  for(i = 0; i < m; ++i) {
    f >> x >> y >> k;
    --x;
    --y;
    int kx = lg[k];
    int ky = kx;
    max_R1 = max(sp_table[kx][x][ky][y], sp_table[kx][x][ky][y + k - (1 << ky)]);
    max_R2 = max(sp_table[kx][x + k - (1 << kx)][ky][y], sp_table[kx][x + k - (1 << kx)][ky][y + k - (1 << ky)]);
    g << max(max_R1, max_R2) << '\n';
  }
  return 0;
}