Cod sursa(job #3269155)

Utilizator apoputoaievladVlad Cristian Apoputoaie apoputoaievlad Data 18 ianuarie 2025 11:51:42
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <bits/stdc++.h>
using namespace std;

/**
RMQ 2D
Vrem sa stim valoarea maxima de pe o submatrice patratica
de latura 2^e si care are coltul stanga sus in (i,j)

rmq[e][i][j] = maximul din submat. cu coltul stg-sus in (i,j)
  si cu latura 2^e
*/

ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n, m;
int rmq[10][505][505];
int e[505], L[20];

int main()
{
    int i, j, x, y, len, k;
    /// construim pe L
    L[0] = 1;
    for (i = 1; i <= 9; i++)
        L[i] = L[i - 1] * 2;
    /// construim e
    e[1] = 0;
    for (i = 2; i <= 500; i++)
        e[i] = 1 + e[i / 2];
    fin >> n >> m;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++)
            fin >> rmq[0][i][j];

    /// recurentele:
    for (k = 1; k <= e[n]; k++)
    {
        len = L[k - 1]; /// 2^k
        for (i = 1; i <= n - len + 1; i++)
            for (j = 1; j <= n - len + 1; j++)
            rmq[k][i][j] = max({rmq[k-1][i][j], rmq[k-1][i+len][j],
                    rmq[k-1][i][j+len], rmq[k-1][i+len][j+len]});
    }
    while (m--)
    {
        fin >> i >> j >> k;
        y = e[k];
        len = L[y];
        fout << max({rmq[y][i][j], rmq[y][i][j + k - len],
                    rmq[y][i + k - len][j], rmq[y][i + k - len][j + k - len]}) << "\n";
    }
    return 0;
}